我正在使用熊猫群的特定列在一个数据,并应用自定义功能到这些组。应用的函数利用副作用,并对函数中的全局数据对象进行操作。
对熊猫、群和应用的一个有记录的警告是,通过设计,它在第一组中应用了两次调用的函数,以决定它是否可以采用快速或缓慢的代码路径。这里记录了这一点: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
在这里的其他一些堆栈溢出文章中提到:
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
这意味着我的副作用会在第一组中被调用两次,并导致不必要的改变。
我的问题是如何使用熊猫,群和应用,而不对第一组(或任何一组)施加副作用,并保证每组只调用一次?。
我正在考虑在DataFrame顶部创建一个虚拟/假组,但我想将我的问题扩展到堆栈溢出社区,以获得更好的解决方案和其他人的利益。
谢谢你的帮助。
编辑:
按照注释中的要求,提供一些关于自定义功能和副作用的更多细节。
使用带有副作用的自定义函数时,需要在函数的开头和结尾使用全局字典。它用键检索数据,并将这些值应用于行,在函数的末尾,更新后的值被更新到全局字典中,以便新值在下一次迭代中得到反映。
与应用一起使用groupby的主要原因是,它是我在有效地迭代dataframe对象时找到的最快的应用程序。我也看过简单的迭代和列表理解。
发布于 2020-01-29 20:48:43
对这个问题的跟进,截止到2019年7月18日Groupby.apply
发布的熊猫版本0.25.0时,它只对第一组进行了一次评估。升级到这个版本可能是解决这个问题的最简单的方法。
在这里发布信息:https://pandas.pydata.org/pandas-docs/stable/whatsnew/v0.25.0.html
https://stackoverflow.com/questions/52711386
复制