我目前正在基于数据框 (A) 执行以下操作,该数据框由两列组成,每列包含数千个唯一值。
>>> pd.DataFrame({
'col1': ['foo', 'bar', 'bar', 'foo', 'baz', 'bar', 'baz'],
'col2': ['abc', 'def', 'abc', 'abc', 'def', 'abc', 'ghi']
})
col1 col2
0 foo abc
1 bar def
2 bar abc
3 foo abc
4 baz def
5 bar abc
6 baz ghi
在此数据帧上执行的操作是:
res = df.groupby(['col1', 'col2']).size().unstack().fillna(0)
输出是一个表 (B),其唯一值为 col1
在 col2
的行和唯一值中以列为单位,每个单元格是原始数据帧中的行数,与唯一值的组合相匹配。
>>> res
col2 abc def ghi
col1
bar 2.0 1.0 0.0
baz 0.0 1.0 1.0
foo 2.0 0.0 0.0
每次操作花费的时间量大约如下:
-
groupby().size()
-> 5% -
unstack()
-> 15% -
fillna(0)
-> 80%
在真实数据集上,整个序列可能需要大约 30 分钟(结构与上面类似,只是更多行和更多唯一值)。
是否有更好/更快的替代方案可以从 (A) 原始数据帧到 (B) 最终结果表?迄今为止成本最高的操作是最终的fillna(0)
所以我对这一点的替代方案特别感兴趣,但完全不同的方法也很棒。
注意:将原 df
中的字符串转换为整数加快groupby().size()
操作大约提高了5倍,但并没有真正影响下面的操作
最佳答案
通过设置fill_value
,在unstack
的同一步骤中填充NA。 :
>>> df.groupby(['col1', 'col2']).size().unstack(fill_value=0)
关于python - 比 groupby、unstack then fillna 更快的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72495322/