我正在使用pandas对数据框中的某些列进行分组,并将自定义函数应用于这些分组。所应用的函数利用了副作用,并在函数内部对全局数据对象进行操作。
文档中提到,pandas、groupby和apply存在一个已知问题:它会在第一组上调用两次函数,以决定是否采用快速或慢速代码路径。具体请参见: http://pandas.pydata.org/pandas-docs/stable/groupby.html#flexible-apply 下面进行演示:
我的问题是如何使用pandas、groupby和apply,而不会在第一组(或任何组)上应用副作用两次,并保证它只在每个组中调用一次?
我想在DataFrame顶部创建一个虚拟/假组,但我想将我的问题扩展到stackoverflow社区以获得更好的解决方案,也为他人提供帮助。
谢谢您的帮助。
编辑:
如评论中所请求的,有关自定义函数和副作用的更多细节。
使用具有副作用的自定义函数使用全局字典,在函数的开始和结束处检索数据。它使用一个键来将值应用于行,在函数结束时,更新后的值会更新到全局字典中,因此新值会反映在下一次迭代中。
使用groupby和apply的主要原因是它是我找到的最快的应用程序,可以有效地迭代DataFrame groupby对象。我还查看了纯迭代和列表推导。
文档中提到,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对象。我还查看了纯迭代和列表推导。