使用 read_csv with chunk 计算每组中的唯一行
Counting unique rows in each group after group by using read_csv with chunk
我的任务是计算第二列中与第一列中的每个唯一值对应的唯一值的数量。例如,如果我有:
A B
1 a
1 a
1 b
2 a
2 a
2 a
我想要这样的东西:
{1: 2, 2: 1}
但我有一个巨大的 csv 文件,无法完整读取它。所以,我使用块大小。我如何在块循环中做到这一点?
我会尝试按以下方式进行:
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 如果你得到的 deduplicated DF 不适合内存,那么我建议你看看 Apache Spark SQL 项目,您可以在其中以分布式方式处理集群上的数据帧。
您可以使用默认字典执行此操作,如下所示:
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))
如果 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])
我的任务是计算第二列中与第一列中的每个唯一值对应的唯一值的数量。例如,如果我有:
A B
1 a
1 a
1 b
2 a
2 a
2 a
我想要这样的东西:
{1: 2, 2: 1}
但我有一个巨大的 csv 文件,无法完整读取它。所以,我使用块大小。我如何在块循环中做到这一点?
我会尝试按以下方式进行:
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 如果你得到的 deduplicated DF 不适合内存,那么我建议你看看 Apache Spark SQL 项目,您可以在其中以分布式方式处理集群上的数据帧。
您可以使用默认字典执行此操作,如下所示:
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))
如果 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])