python - 比 groupby、unstack then fillna 更快的替代方案

标签 python pandas dataframe fillna

我目前正在基于数据框 (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),其唯一值为 col1col2 的行和唯一值中以列为单位,每个单元格是原始数据帧中的行数,与唯一值的组合相匹配。

>>> 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/

相关文章:

python - 我如何使用模拟在 greenlet 中进行测试?

python - 循环列表列表并保存不同的文件

python - 如何快速搜索pandas中的重复值?

python - 如何在 Pandas Dataframe 中跨行和列累积链接值?

python - 如何连接两个 ID 不匹配的数据帧并创建新列来表示数据帧 ID 的来源?

Python : ( msg = email. message_from_string(aaa) ) 值在尝试从原始电子邮件源解析内容时返回 ( None )

python - 是否可以在连接中分配 django channel 组?

python - 将列表列表中的数据添加到数据框的自己的行中

python - Pandas read_csv 防止文件中的引号成为数据的一部分

python - python 数据框删除重复项