python - 如何正确使用带有apply功能的pandas groupby来解决副作用? (第一组申请两次)

标签 python pandas dataframe apply pandas-groupby

我正在使用 Pandas 对数据框中的某些列进行分组,并将自定义函数应用于这些组。应用函数利用副作用并作用于函数内的全局数据对象。

pandas、groupby 和 apply 的一个记录警告是,按照设计,它在第一组上应用两次调用的函数来决定它是否可以采用快速或慢速的代码路径。这是记录在这里:
http://pandas.pydata.org/pandas-docs/stable/groupby.html#flexible-apply

此处演示:

In [144]: d = pd.DataFrame({"a":["x", "y"], "b":[1,2]})

In [145]: def identity(df):
   .....:     print(df)
   .....:     return df
   .....: 

In [146]: d.groupby("a").apply(identity)
   a  b
0  x  1
   a  b
0  x  1
   a  b
1  y  2
Out[146]: 
   a  b
0  x  1
1  y  2

在此处的其他一些 stackoverflow 帖子中提到:

Python pandas groupby object apply method duplicates first group

Is Pandas 0.16.1 groupby().apply() method applying function more than once to the same group?

在此处在 GitHub 上提及:

https://github.com/pandas-dev/pandas/issues/7739

https://github.com/pandas-dev/pandas/issues/19167

这意味着我的副作用在第一组中被调用两次并导致不需要的更改。

我的问题是如何使用 pandas、groupby 和 apply 而不会在第一组(或任何组)上应用两次副作用,并保证它只在每个组上调用一次?

我想在 DataFrame 的顶部创建一个虚拟/假组,但我想将我的问题扩展到 stackoverflow 社区,以获得更好的解决方案并造福他人。

感谢您的帮助。

编辑:

根据评论中的要求,关于自定义功能和副作用的更多详细信息。

使用带有副作用的自定义函数会在函数的开头和结尾使用全局字典。它使用键检索数据并将这些值应用于行,在函数结束时,更新的值将更新到全局字典,以便新值反射(reflect)在下一次迭代中。

将 groupby 与 apply 一起使用的主要原因是,它是我在有效迭代数据帧 groupby 对象时设法找到的最快的应用程序。我还研究了普通迭代和列表理解。

最佳答案

对这个问题的跟进,截至 2019 年 7 月 18 日发布的 Pandas 0.25.0 版 Groupby.apply在数据帧上只评估第一组一次。升级到这个版本可能是解决这个问题的最直接的方法。

此处发布信息:https://pandas.pydata.org/pandas-docs/stable/whatsnew/v0.25.0.html

关于python - 如何正确使用带有apply功能的pandas groupby来解决副作用? (第一组申请两次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52711386/

相关文章:

python - 从 Pandas Dataframe 获取一个或多个列值作为列表

python - 我的 admin.TabularInline 类返回异常 : object has no attribute 'urls'

python - pandas:将数据帧减少到仅出现特定的事件链

python - PyQt5 模型/ View - 一个模型,两个 View

python - pandas dataframe where 子句带点与括号列选择

python - 在 Python 中使用 Pandas 组合三个 DataFrame

Python:获取 Pandas 系列列表长度的有效方法

r - 计算净利润

python - 零个或一个量词 (`?` ) 似乎并不贪婪

python - 如何在 rpy2 中静默输出到 stdout?