考虑以下数据框:
df = pd.DataFrame({
'a': np.arange(1, 5),
'b': np.arange(1, 5) * 2,
'c': np.arange(1, 5) * 3
})
a b c
0 1 2 3
1 2 4 6
2 3 6 9
3 4 8 12
我想计算各列中每行的累积总和:
def expanding_func(s):
return s.sum()
df.expanding(1, axis=1).apply(expanding_func, raw=True)
# As expected:
a b c
0 1.0 3.0 6.0
1 2.0 6.0 12.0
2 3.0 9.0 18.0
3 4.0 12.0 24.0
但是,如果我设置 raw=False
,expanding_func
就不再起作用:
df.expanding(1, axis=1).apply(expanding_func, raw=False)
ValueError: Length of passed values is 3, index implies 4
documentation说 expanding_func
Must produce a single value from an ndarray input if raw=True or a single value from a Series if raw=False.
这正是我正在做的事情。为什么 raw=False
时 expanding_func
失败?
注意:这只是一个人为的示例。我想知道如何编写自定义滚动函数,而不是如何计算跨列的累积和。
最佳答案
这似乎是 pandas 的一个错误。
如果你这样做:
df.iloc[:3].expanding(1, axis=1).apply(expanding_func, raw=False)
它确实有效。似乎当作为系列传递时,pandas 出于某种原因尝试检查返回的列数和数据帧的行数。 (它应该比较 df 的列数)
一种解决方法是转置 df,应用您的函数并转置回来,这似乎有效。该错误似乎仅在 axis 设置为 1 时影响。
df.T.expanding(1, axis=0).apply(expanding_func, raw=False).T
a b c
0 1.0 3.0 6.0
1 2.0 6.0 12.0
2 3.0 9.0 18.0
3 4.0 12.0 24.0
关于python - raw=False 的自定义扩展函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59572728/