我需要计算大量独立列(按固定的2-5个其他列分组)中的值的计数(例如value_counts表示的值)。此练习是数据挖掘中的一部分,该数据具有多达数百万行和多达50-100列。因此,解决方案需要尽可能高效。为了将所有这些数据一起存储在内存中,我在读取源数据时预先将所有列转换为类型为“类别”。
以下数据可作为示例:
raw_data = {'grpVar1': ['A', 'A', 'A', 'B', 'B', 'B'],
'grpVar2': ['X', 'Y', 'X', 'Y', 'Z','X'],
'catVar1': ['car', 'bike', 'car', 'bike', 'car', 'bike'],
'catVar2': ['red','blue','black', 'red','blue','black']}
df = pd.DataFrame(raw_data, columns = ['grpVar1', 'grpVar2', 'catVar1', 'catVar2'])
df = df.astype('category')
对于以上数据,我希望获得如下汇总数据。请忽略组的排序顺序。
grpVar1 grpVar2 Column Value Count
A X catVar1 car 2
Y catVar1 bike 1
B X catVar1 bike 1
Y catVar1 bike 1
Z catVar1 car 1
A X catVar2 black 1
catVar2 red 1
Y catVar2 blue 1
B X catVar2 black 1
Y catVar2 red 1
Z catVar2 blue 1
我能想到的一个选择是融化数据框,然后进行值计数。但这似乎不是明智的选择内存(因为现在数据不再是分类和未压缩的)和性能。请指教。
答案 0 :(得分:0)
循环浏览要融合的列。进行分组和连接。这样可以节省一些空间。说到时间,这可能不会超过融化功能。
df['cnt'] = 1
output = []
for col in df.columns[2:-1]:
grp = df[list(df.columns[:2])+ [col] + ['cnt']].groupby(list(df.columns[:2])+ [col]).sum().dropna()
grp['column'] = col
grp.rename({col: 'value'}, inplace=True)
output.append(grp)
output = pd.concat(output)