我的任务是第二列中唯一值的计数,它对应第一列中的每个唯一值。例如,如果我有:
A B
1 a
1 a
1 b
2 a
2 a
2 a
我希望有这样的东西:
{1: 2, 2: 1}
但我有一个巨大的csv文件并且无法完整阅读。所以,我使用chunksize。我怎么能在一个块循环中做到这一点?
答案 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])