如何正确使用pandas groupby和apply函数来产生副作用? (第一组申请两次)

时间:2018-10-08 23:33:45

标签: python pandas dataframe apply pandas-groupby

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

有记录的关于熊猫,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对象上找到的最快的应用程序。我还研究了简单的迭代和列表理解。

1 个答案:

答案 0 :(得分:1)

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

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