我有一个熊猫数据框df
。我要按id
,type
和scenario
分组。然后计算val
列的滚动平均值,并使用结果计算另一个版本,如下所示:
period = 120
period_2 = 12
group = df.groupby(['id', 'type', 'scenario'], as_index=False)
df['val_rolmean'] = (group['val'].rolling(period_2*2, center=True, min_periods=1).mean() * 12).reset_index(level=0, drop=True)
df['val_rolmean2'] = (group['val_rolmean']/(group['rate'].shift(period).fillna(0) + 0.0050)).reset_index(level=0, drop=True)
但是它抛出了这个错误:
ValueError: cannot coerce to Series, length必须为1:给定219
我使用的是熊猫版本1.0.5
我不知道这是否符合你正在寻找的。
由于df
可以包含分组列['id', 'type', 'scenario']
的重复值,因此我创建了具有唯一值的数据框df_grouped
。
并将每个新的计算列添加到其中。
我删除了参数level=0
,因为它在本例中不是必需的。
import pandas as pd
import numpy as np
df = pd.DataFrame(
np.random.randint(0,4,size=(1000, 5)),
columns=['id', 'type', 'scenario', 'val', 'rate'])
period = 120
period_2 = 12
# Data Frame with unique lst_col_group values
lst_col_group = ['id', 'type', 'scenario']
mask = df[lst_col_group].drop_duplicates().index
df_grouped = df.loc[mask]
group = df.groupby(lst_col_group, as_index=False)
df_grouped['val_rolmean'] = (
group['val']
.rolling(period_2*2, center=True, min_periods=1)
.mean() * 12
).reset_index(drop=True) # level=0 (it didn't work in this case)
df_grouped['val_rolmean2'] = (
df_grouped['val_rolmean']/(
df_grouped['rate'].shift(period).fillna(0) + 0.0050)
).reset_index(drop=True) # level=0 (id didn't work in this case)
print(df_grouped.head())
# id type scenario val rate val_rolmean val_rolmean2
# 0 3 3 3 3 1 20.000000 4000.000000
# 1 1 1 0 1 2 21.230769 4246.153846
# 2 1 3 1 0 1 19.714286 3942.857143
# 3 1 0 1 2 2 20.800000 4160.000000
# 4 2 2 3 3 0 19.500000 3900.000000