通过使用带有块的read_csv计算组后每组中的唯一行

时间:2016-06-05 16:46:14

标签: python pandas chunks

我的任务是第二列中唯一值的计数,它对应第一列中的每个唯一值。例如,如果我有:

A  B
1  a
1  a
1  b
2  a
2  a
2  a

我希望有这样的东西:

{1: 2, 2: 1}

但我有一个巨大的csv文件并且无法完整阅读。所以,我使用chunksize。我怎么能在一个块循环中做到这一点?

3 个答案:

答案 0 :(得分:0)

我会尝试以下列方式进行:

df = pd.DataFrame()
chunksize = 10**5

for t in pd.read_csv(filename, usecols=['A','B'], chunksize=chunksize):
    df = pd.concat([df, t.drop_duplicates()], ignore_index=True).drop_duplicates()

print(df.groupby(['A'])['B'].nunique())

或者如果您需要字典:

print(df.groupby(['A'])['B'].nunique().to_dict())

PS我担心你无法在不同的块中计算它,因为可能在不同的块中重复。因此,我目前最好的想法是收集所有数据并在每一步中删除重复项 - 这可能有助于减少一点数据量

PPS如果您的重复数据删除 DF不适合内存,那么我建议您查看Apache Spark SQL项目,您可以在其中处理数据框。集群以分布式方式。

答案 1 :(得分:0)

您可以使用默认字典执行此操作,如下所示:

from collections import defaultdict
col_d = defaultdict(list)
with open('myfile', 'r') as infile:
     for line in infile:
          if 'A' in line or 'B' in line:
               continue
          line = line.strip().split('  ')
          if len(col_d) == 0:
               col_d[line[0]].append(line[1])
          elif line[1] in col_d[line[0]]:
               pass
          else:
               col_d[line[0]].append(line[1])

for key, value in col_d.items():
     print '{0}\t{1}'.format(key, len(value))

答案 2 :(得分:0)

如果B中唯一值的数量不是那么大,你可以使用defaultdict并设置看起来像这样的东西:

from collections import defaultdict
dict = defaultdict(set)
with open('file', 'r') as f:
    for line in f:
      line = line.strip().split('  ')
      col_d[line[0]].add(line[1])
for key in dict:
    dict[key]= len(dict[key])