[英]How to properly use pandas groupby with apply function for side effects? (First group applied twice)
我正在使用 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 对象应用方法复制第一组
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 对象时设法找到的最快的应用程序。 我还研究了普通迭代和列表理解。
对这个问题的跟进,截至 2019 年 7 月 18 日发布的 Pandas 0.25.0 版Groupby.apply
在数据帧上仅评估第一组一次。 升级到这个版本可能是解决这个问题的最直接的方法。
此处发布信息: https : //pandas.pydata.org/pandas-docs/stable/whatsnew/v0.25.0.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.