1

CSVファイルからデータを読み取って(A)、データを抽出して、別のCSVファイルに書き込もうとしています(B)。新しいファイルBには、2つの列が必要です。列1はファイルAの列1の名前をリストし、列2はファイルAの列1の数をリストします。たとえば、ファイルAが「:」なしで次のようになっている場合(2列に並んでいます):

Animal: Gender
Rabbit: Male
Dog: Male
Rabbit: Female
Cat: Male
Cat: Male
Dog: Female
Dog: Male
Turtle: Male

ファイルBの出力を次のようにしたいと思います(実際には、「:」のない別の列にあります)。

Animal: Count
Cat: 2
Dog: 3
Rabbit: 2
Turtle: 1

私がこのようなことをするのはこれが初めてであり、これは私がこれまでに行ったことですが、ファイルBにデータを印刷して、「カウント」を正しく行うことができません。誰かがこれを手伝ってくれませんか?

import csv
ReadData=csv.reader(open('C:\Users\..\FileA.csv','rb'), delimiter=',')

def column(ReadData, i):
    return [row[i] for row in ReadData]

for line in ReadData:
   WriteData=csv.writer(open('C:\Users\..\FileB.csv','wb'),
                        delimiter=' ', quotechar=':', quoting=csv.QUOTE_ALL)
   print column(ReadData,1)

よろしくお願いします!

4

4 に答える 4

2

Python >=2.7 でカウントを行うには、この例をcollections.Counter参照してください。については、こちらcollections.defaultdictを参照してください。

への呼び出しcsv.writerでは、コロンが引用符であるかのように、「:Hello World: 12345」が出力さquotechar=':'れる可能性があります (これにより、エラーが発生します)。WriteData.writerow(['Hello World', 12345]

column(ReadData, i)また、関数が消費することに注意してくださいReadData。後続の ReadData の呼び出しでは、空のリストが返される可能性があります (テストされていません)。これはコードの問題ではありません (少なくとも今は)。

これは、CSV モジュールを使用しないソリューションです (結局のところ、これらのファイルは CSV とあまり似ていません)。

import collections

inputfile = file("A")

counts = collections.Counter()

for line in inputfile:
    animal = line.split(':')[0]
    counts[animal] += 1

for animal, count in counts.iteritems():
    print '%s: %s' % (animal, count)
于 2012-07-25T22:51:44.433 に答える
1

あなたの質問のカウント部分にお答えします。おそらく、それを質問の csv 部分と組み合わせることができます。

l = [
    ('Animal','Gender'),
    ('Rabbit','Male'),
    ('Dog','Male'),
    ('Rabbit','Female'),
    ('Cat','Male'),
    ('Cat','Male'),
    ('Dog','Female'),
    ('Dog','Male'),
    ('Turtle','Male')
    ]

d = {}
for k,v in l:
    if not k in d:
        d[k] = 1
    else:
        d[k] += 1

for k in d:
    print "%s: %d" % (k,d[k])

ヘッダー行をフィルタリングしませんでした。このコードの出力は次のとおりです。

Turtle: 1
Cat: 2
Rabbit: 2
Animal: 1
Dog: 3

編集

これを置き換えることができます:

if not k in d:
    d[k] = 1
else:
    d[k] += 1

これとともに:

d[k] = d.setdefault(k,0) + 1
于 2012-07-25T22:50:06.793 に答える
0

データのサイズと複雑さによっては...http://pandas.pydata.org/のinfoを使用して、PyPiで入手できるようにすることを検討しpandasください。

ただし、これはやり過ぎの可能性が高いことに注意してください。しかし、私はそれをミックスに投入すると思いました。

from pandas import DataFrame

# rows is processed from string in the OP
rows = [['Rabbit', ' Male'], ['Dog', ' Male'], ['Rabbit', ' Female'], ['Cat', ' Male'], ['Cat', ' Male'], ['Dog', ' Female'], ['Dog', ' Male'], ['Turtle', ' Male']]

df = pandas.DataFrame(rows, columns=['animal', 'gender'])

>>> df.groupby('animal').agg(len)
        gender
animal        
Cat          2
Dog          3
Rabbit       2
Turtle       1

>>> df.groupby(['animal', 'gender']).agg(len)
animal  gender 
Cat      Male      2
Dog      Female    1
         Male      2
Rabbit   Female    1
         Male      1
Turtle   Male      1
于 2012-07-25T23:10:44.800 に答える
0

itertoolsモジュールとgroupby関数を見てください。例えば:

from itertools import groupby

animals = [
    ('Rabbit', 'Male'),
    ('Dog', 'Male'),
    ('Rabbit', 'Female'),
    ('Cat', 'Male'),
    ('Cat', 'Male'),
    ('Dog', 'Female'),
    ('Dog', 'Male'),
    ('Turtle', 'Male')
    ]

def get_group_key(animal_data):
    return animal_data[0]

animals = sorted(animals, key=get_group_key)
animal_groups = groupby(animals, get_group_key)

grouped_animals = []
for animal_type in animal_groups:
    grouped_animals.append((animal_type[0], len(list(animal_type[1]))))

print grouped_animals

>>> [('Cat', 2), ('Dog', 3), ('Rabbit', 2), ('Turtle', 1)]
于 2012-07-25T22:57:06.270 に答える