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

Zer*_*ack 5 python apply dataframe pandas 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
Run Code Online (Sandbox Code Playgroud)

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

Python Pandas groupby 对象应用方法复制第一组

Pandas 0.16.1 groupby().apply() 方法是否对同一组多次应用函数?

在 GitHub 上提到:

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

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

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

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

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

感谢您的帮助。

编辑:

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

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

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

Zer*_*ack 1

自 2019 年 7 月 18 日发布的 pandas 版本 0.25.0 开始,该问题的Groupby.apply后续数据框仅对第一组进行一次评估。升级到此版本可能是解决此问题的最直接方法。

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