python - raw=False 的自定义扩展函数

标签 python pandas

考虑以下数据框:

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=Falseexpanding_func 就不再起作用:

df.expanding(1, axis=1).apply(expanding_func, raw=False)
ValueError: Length of passed values is 3, index implies 4

documentationexpanding_func

Must produce a single value from an ndarray input if raw=True or a single value from a Series if raw=False.

这正是我正在做的事情。为什么 raw=Falseexpanding_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/

相关文章:

python - Pandas 添加两个多索引数据帧

python - 如何用条件填充缺失值?

python - Matplotlib gridspec - 将另一个三次图放置在几个子图旁边

python - 根据上一行中的值在时间索引的 Pandas 数据框中删除以下 n 行

python - 如果 Pandas 从多列返回值等于另一列中的值

基于 Pandas 时间序列级别创建 1 和 0 的递归序列的 Pythonic 方法

python - 从 numpy 中的一维向量映射二维延迟向量

python - 有效地将大型 numpy 数组切片复制到较小的连续内存数组

python - Django:使用 related_name 添加引用同一个表的 2 个外键导致 NameError - 未定义给定相关名称的值

python - 导入错误:C 扩展:没有名为 'parsing' 的模块未构建