1

itertools.groupbyタブ区切りの短いテキストファイルを解析するために使用しています。テキストファイルにはいくつかの列があり、特定の列に特定の値を持つすべてのエントリをグループ化するだけですx。以下のコードはname2、変数の値を探して、と呼ばれる列に対してこれを行いますxcsv.DictReaderとを使用してこれを実行しようとしましitertools.groupbyた。テーブルには、この基準に一致する8つの行があるため、8つのエントリが返されます。代わりgroupbyに、2セットのエントリを返します。1つは1つのエントリで、もう1つは7で、これは間違った動作のようです。同じデータに対して以下の手動でマッチングを行い、正しい結果を取得します。

import itertools, operator, csv
col_name = "name2"
x = "ENSMUSG00000002459"
print "looking for entries with value %s in column %s" %(x, col_name)
print "groupby gets it wrong: "
data = csv.DictReader(open(f), delimiter="\t", fieldnames=fieldnames)
for name, entries in itertools.groupby(data, key=operator.itemgetter(col_name)):
    if name == "ENSMUSG00000002459":
        wrong_result = [e for e in entries]
        print "wrong result has %d entries" %(len(wrong_result))
print "manually grouping entries is correct: "
data = csv.DictReader(open(f), delimiter="\t", fieldnames=fieldnames)
correct_result = []
for row in data:
    if row[col_name] == "ENSMUSG00000002459":
        correct_result.append(row)
print "correct result has %d entries" %(len(correct_result))

私が得る出力は次のとおりです。

looking for entries with value ENSMUSG00000002459 in column name2
groupby gets it wrong: 
wrong result has 7 entries
wrong result has 1 entries
manually grouping entries is correct: 
correct result has 8 entries

ここで何が起こっているのですか?が本当にグループ化されている場合groupbyは、ごとに1セットのエントリのみを取得する必要があるようですxが、代わりに2つを返します。私はこれを理解することはできません。 編集:ああ、それはソートされるべきだと思いました。

4

3 に答える 3

3

ドキュメントによるとgroupby()、同じキーの連続した出現のみをグループ化します。

于 2012-10-24T00:05:40.800 に答える
3

コードを変更して、データを強制的にキーオーダーにする必要があります...

data = csv.DictReader(open(f), delimiter="\t", fieldnames=fieldnames)
sorted_data = sorted(data, key=operator.itemgetter(col_name))
for name, entries in itertools.groupby(data, key=operator.itemgetter(col_name)):
    pass # whatever

ただし、主な用途は、データセットが大きく、データがすでにキーの順序になっている場合です。したがって、とにかく並べ替える必要がある場合は、を使用するdefaultdict方が効率的です。

from collections import defaultdict
name_entries = defaultdict(list)
for row in data:
    name_entries[row[col_name]].append(row)
于 2012-10-24T00:13:16.007 に答える
2

あなたのデータがどのように見えるかはわかりませんが、ソートされていないと思います。groupbyはソートされたデータを処理します

于 2012-10-24T00:05:32.990 に答える