【问题标题】:Faster Way to GroupBy Apply Python Pandas?GroupBy 应用 Python Pandas 的更快方法?
【发布时间】:2020-06-19 20:04:00
【问题描述】:

如何让 Groupby Apply 运行得更快,或者如何以不同的方式编写它?

import numpy as np
import pandas as pd

df = pd.DataFrame({'ID':[1,1,1,1,1,2,2,2,2,2],\
                   'value':[1,2,np.nan,3,np.nan,1,2,np.nan,4,np.nan]})

result = df.groupby("ID").apply(lambda x: len(x[x['value'].notnull()].index)\
                    if((len(x[x['value']==1].index)>=1)&\
                    (len(x[x['value']==4].index)==0)) else 0)

输出:

Index  0  
1      3  
2      0

我的程序现在运行得很慢。我可以让它更快吗?我过去在使用 groupby() 之前进行了过滤,但在这种情况下我没有看到一种简单的方法。

【问题讨论】:

  • 有最近引入的parallel_apply -> towardsdatascience.com/…
  • 嗨。你能解释一下你想要达到的目标吗?使用 Pandas 的矢量化方法可以提高速度
  • 嗨。分组后,如果组包含一个值(在本例中为 1)并且不包含另一个值(在本例中为 4),我想计算组中值的数量。如何使用 Pandas 的矢量化方法?

标签: python pandas pandas-groupby pandas-apply


【解决方案1】:

不确定这是否是您需要的。我已经对其进行了一些分解,但是您可以轻松地对其进行方法链接以使代码更紧凑:

df = pd.DataFrame(
    {
        "ID": [1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
        "value": [1, 2, np.nan, 3, np.nan, 1, 2, np.nan, 4, np.nan],
    }
)

df["x1"] = df["value"] == 1
df["x2"] = df["value"] == 4

df2 = df.groupby("ID").agg(
    y1=pd.NamedAgg(column="x1", aggfunc="max"),
    y2=pd.NamedAgg(column="x2", aggfunc="max"),
    cnt=pd.NamedAgg(column="value", aggfunc="count"),
)

df3 = df2.assign(z=lambda x: (x['y1'] & ~x['y2'])*x['cnt'])

result = df3.drop(columns=['y1', 'y2', 'cnt'])
print(result)

这将产生

    z
ID   
1   3
2   0

【讨论】:

  • 感谢您的回答。 agg() 比 apply() 快很多吗?
  • 我会假设我的解决方案比你的 lambda 函数更快,因为它可以并行处理整个向量。但我很想听听它是如何在您的更大数据集上工作的。
  • 非常完美。谢谢你。由于矢量化,它比我的要快几倍。
猜你喜欢
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 2021-04-07
  • 2016-02-06
  • 2021-02-04
  • 1970-01-01
  • 2021-02-02
相关资源
最近更新 更多