【问题标题】:How to use pandas rolling apply with a simple custom function?如何通过简单的自定义函数使用 pandas rolling apply?
【发布时间】:2021-06-22 03:57:49
【问题描述】:

我有一个函数func,我想将其应用于熊猫数据帧的连续行。但是,当我尝试如下操作时,我得到了 ValueError:

import numpy as np
import pandas as pd

def func(a: np.ndarray, b: np.ndarray) -> float:
    """Return the sum of sum of vectors a and b"""
    return np.sum(a) + np.sum(b)

df = pd.DataFrame({"a": [1, 2, 3, 4, 5], "b": [10, 11, 12, 13, 14]})
df.rolling(window=2, axis=1).apply(func)
>>>
ValueError: Length of passed values is 2, index implies 5.

我要做的就是将func 滚动应用于连续行(这就是我在上面选择window=2 的原因)。下面的sn-p是手动实现的。

func(df.iloc[0, :].values, df.iloc[1, :].values)
>>> 24
func(df.iloc[1, :].values, df.iloc[2, :].values)
>>> 28

等等。

请注意,我为 func 提供的示例仅用于说明目的 - 我知道在这种情况下您可以使用简单的 df.sum(axis=1) + df.shift(-1).sum(axis=1)。我想知道的是,在一般情况下,您如何使用滚动申请自定义函数。

【问题讨论】:

  • 不可能像你需要的那样,因为rolling单独处理每一行,这意味着首先处理0然后1....所以不能把它们相加。
  • @jezrael 我不敢相信这在熊猫中是不可能的。该工具总是如此多才多艺和灵活。你会认为这是一个很大的用例。
  • 您为什么不分别制作两个不同的n-rolling 列?然后创建另一列,该条目将是您的 func 应用于具有相应索引的这两个滚动列的条目。鉴于您的加法示例,我想这将是任何交换函数func 的解决方案。

标签: python pandas rolling-computation


【解决方案1】:

我想这可以通过几行代码和一个中间数据帧来完成:

import numpy as np
import pandas as pd

def func(a: np.ndarray) -> float:
    return np.sum(a)

df = pd.DataFrame({"a": [1, 2, 3, 4, 5], "b": [10, 11, 12, 13, 14]})
df_rolled = df.rolling(window=2).apply(func)
df["ab_rolled"] = [func([df_rolled["a"][i], df_rolled["b"][i]])
                   for i in range(0, len(df_rolled["a"]))]

print(df)

输出:

   a   b  ab_rolled
0  1  10        NaN
1  2  11       24.0
2  3  12       28.0
3  4  13       32.0
4  5  14       36.0

不过,这口井可能是一个丑陋的代码。抱歉,我是第一次使用 pandas。

【讨论】:

    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2018-08-04
    • 2021-01-20
    • 2020-03-19
    相关资源
    最近更新 更多