我正在使用熊猫对数据框中的某些列进行分组,并将自定义函数应用于这些组。应用的函数利用了副作用,并对函数中的全局数据对象起作用。
有记录的关于熊猫,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
这意味着我的副作用在第一组上被调用了两次,并导致了不必要的变化。
我的问题是如何使用熊猫,groupby并应用,而不会在第一个组(或任何与此相关的组)上施加两次副作用,并确保每个组仅调用一次? strong>
我当时想在DataFrame的顶部创建一个虚拟/伪造组,但我想将问题扩展到stackoverflow社区,以获得更好的解决方案并为他人造福。
谢谢您的帮助。
编辑:
根据评论中的要求,有关自定义功能和副作用的更多详细信息。
使用具有副作用的自定义函数会在函数的开头和结尾使用全局字典。它使用键检索数据并将这些值应用于行,在函数末尾,更新后的值将更新到全局字典,以便新值反映在下一次迭代中。
将groupby与apply一起使用的主要原因是,这是我设法在有效地遍历数据帧groupby对象上找到的最快的应用程序。我还研究了简单的迭代和列表理解。
答案 0 :(得分:1)
此问题的后续行动,自数据框Groupby.apply
于2019年7月18日发布的熊猫版本0.25.0以来,仅对第一组进行一次评估。升级到此版本可能是解决此问题的最直接方法。
在此处发布信息:https://pandas.pydata.org/pandas-docs/stable/whatsnew/v0.25.0.html