【问题标题】:Python: Itertools groupby for unique key value pairsPython:用于唯一键值对的 Itertools groupby
【发布时间】:2015-09-22 23:53:51
【问题描述】:

我正在尝试根据列对 csv 文件中的数据进行分组。我试过了:

from itertools import groupby
import csv
with open('path/trial.csv', 'rb') as f:
    reader = csv.reader(f)
    things = list(reader)

for key, group in groupby(things, lambda x: x[0]):
    listOfThings = len(",".join([thing[1] for thing in group]).split(","))
    print key + "," + str(listOfThings)

当第 1 列中的数据按特定顺序排列时,它起作用。如果它重复,计数就会变得混乱。

A,1
A,2
A,1
B,0
B,8

我明白了

A,3
B,2

A,1
A,2
B,0
B,8
A,1

我明白了

A,2
B,2
A,1

我希望我的脚本同时考虑唯一键和唯一值,并且输出为(仅取 A,1 一次,尽管它出现两次):

A,2
B,2

根据 Chad Simmon 的评论,改为:

sortedlist = list(reader)
things= sorted(sortedlist, key=operator.itemgetter(0), reverse=True)

它现在给了我

B,2
A,3

我想要 A,2。

【问题讨论】:

  • groupby 仅对连续重复进行分组。如果要对整个集合进行分组,则需要使用字典或类似工具。
  • @ChadSimmons 感谢您的评论。尝试排序,其中一部分起作用了。请查看已编辑的问题。

标签: python csv group-by itertools


【解决方案1】:

我认为 Chad Simmons 的意思是,如果您想在整个集合的上下文中确定唯一性,则应该使用 groupby() 以外的其他内容。但是,我建议您不要使用字典,而是使用 set(与字典类似)以及称为 collections.Counter 的字典子类。

首先构造文件中所有唯一值对的set,然后构造一个只考虑该对的第一个值的Counter(您称之为)。如果您希望结果排序,您还需要对 Counter 的内容进行排序,因为它在字典中是无序的,如下所示。

from collections import Counter
import csv

with open('trial.csv', 'rb') as f:
    unique_pairs = set((row[0], row[1]) for row in csv.reader(f))
    for key, count in sorted(Counter(pair[0] for pair in unique_pairs).items()):
        print('{},{}'.format(key, count))

【讨论】:

    【解决方案2】:

    做到了:

    from itertools import groupby
    import csv, operator, itertools
    with open('trial.csv', 'rb') as f:
        reader = csv.reader(f)
        sortedlist = list(reader)
        things= sorted(sortedlist, key=operator.itemgetter(0), reverse=True)
        things.sort()
        things = list(k for k,_ in itertools.groupby(things))
    
    for key, group in groupby(things, lambda x: x[0]):
        listOfThings = len(",".join([thing[1] for thing in group if not thing in things[1]]).split(","))
        print key + "," + str(listOfThings)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多