如何正确使用带有副作用的apply函数的pandas groupby?(第一组被应用两次)

5
我正在使用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社区以获得更好的解决方案,也为他人提供帮助。
谢谢您的帮助。
编辑:
如评论中所请求的,有关自定义函数和副作用的更多细节。
使用具有副作用的自定义函数使用全局字典,在函数的开始和结束处检索数据。它使用一个键来将值应用于行,在函数结束时,更新后的值会更新到全局字典中,因此新值会反映在下一次迭代中。
使用groupby和apply的主要原因是它是我找到的最快的应用程序,可以有效地迭代DataFrame groupby对象。我还查看了纯迭代和列表推导。

你能提供一个使用案例或“副作用”的例子吗?这将为您的问题提供更多上下文,并帮助我们理解为什么双重调用是个问题。 - jpp
已在文档 http://pandas.pydata.org/pandas-docs/stable/groupby.html#flexible-apply 中提及,还可以查看 Github https://github.com/pandas-dev/pandas/issues/7739。 - BENY
@jpp我认为他在这里无法回答,因为问题与pandas API构建有关。 - BENY
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接