【发布时间】:2021-09-29 07:00:06
【问题描述】:
使用 Pandas 1.1.5,我有一个如下所示的测试 DataFrame:
import numpy as np
import pandas as pd
df = pd.DataFrame({'id': ['a0','a0','a0','a1','a1','a1','a2','a2'],
'a': [4,5,6,1,2,3,7,9],
'b': [3,4,5,3,2,4,1,3],
'c': [7,4,3,8,9,7,4,6],
'denom_a': [7,8,9,7,8,9,7,8],
'denom_b': [10,11,12,10,11,12,10,11]})
我想在滚动窗口上应用以下自定义聚合函数,其中函数的计算取决于列名:
def custom_func(s, df, colname):
if 'a' in colname:
denom = df.loc[s.index, "denom_a"]
calc = s.sum() / np.max(denom)
elif 'b' in colname:
denom = df.loc[s.index, "denom_b"]
calc = s.sum() / np.max(denom)
else:
calc = s.mean()
return calc
df.groupby('id')\
.rolling(2, 1)\
.apply(lambda x: custom_func(x, df, x.name))
这会导致TypeError: argument of type 'NoneType' is not iterable,因为每列的窗口子集不保留原始df 列的名称。也就是说,作为参数传入的x.name实际上是在传递None,而不是原始列名的字符串。
是否有某种方法可以使这种方法发挥作用(例如,保留使用 apply 作用的列名并将其传递给函数)?或者有什么改变它的建议吗?我查阅了以下参考资料,让自定义函数在同一窗口计算中使用多个列,等等:
【问题讨论】:
-
所以,复制并粘贴你在这里的内容,我实际上得到了一个
DataError: No numeric types to aggregate。 (只是指出这一点。)此外,这里的.groupby没有帮助,因为我们只会将三行作为单独的组。您能否进一步充实您的示例df? -
@John 好点 RE:
.groupby,我已经相应地更新了 df 以提供更多帮助。至于DataError,我无法重现它。 -
if 'a' in colname-->if colname == 'a'(等等)? -
@Brendan 不幸的是不是,它故意在当前 colname 的字符串中查找子字符串(此示例数据是我真实 df 的更简单的虚拟版本)。它通常可能是
if 'per_hour' in colname等。
标签: python pandas apply rolling-computation