Python 级联分组/转换操作
假设我有一组组和子组,带有日期和值 最后我需要的是评估一个滚动平均值,使用窗口2,按组按月计算。使用过去2个月评估当前月份的值 如果我将数据帧减少两个连续的groupby,我可以实现这一点: 第一个用于计算每个groupby组的值之和的值 组|日期、总数 第二种方法是通过 按组分组|月、变换、滚动 但这减少了我的数据 我需要的是使用转换操作来完成这一切,这样我就可以在原始数据帧上以列的形式获得结果 让我们看看这个虚拟数据:Python 级联分组/转换操作,python,pandas,Python,Pandas,假设我有一组组和子组,带有日期和值 最后我需要的是评估一个滚动平均值,使用窗口2,按组按月计算。使用过去2个月评估当前月份的值 如果我将数据帧减少两个连续的groupby,我可以实现这一点: 第一个用于计算每个groupby组的值之和的值 组|日期、总数 第二种方法是通过 按组分组|月、变换、滚动 但这减少了我的数据 我需要的是使用转换操作来完成这一切,这样我就可以在原始数据帧上以列的形式获得结果 让我们看看这个虚拟数据: values = [100, 100, 200, 200, 300, 3
values = [100, 100, 200, 200, 300, 300]
dates = ['2017-01-01', '2017-02-01',
'2018-01-01', '2018-02-01',
'2019-01-01', '2019-02-01']
df1 = pd.DataFrame({'date': dates, 'value': values})
df1['subgroup'] = 'subgroup1'
df2 = df1.copy()
df2['subgroup'] = 'subgroup2'
df2['value'] = df2.value *2
df_g1 = pd.concat([df1, df2], axis=0)
df_g1['group'] = 'group1'
df_g2 = df_g1.copy()
df_g2['group'] = 'group2'
df_g2['value'] = df_g2.value *2
df = pd.concat([df_g1, df_g2], axis=0)
df['date'] = pd.to_datetime(df.date)
现在执行第一个groupby操作:
df_total_by_group = df.groupby(['group', 'date'], as_index=False)[['value']].sum()
df_total_by_group['month'] = df_total_by_group['date'].dt.month
现在滚动平均值:
def rolling_mean(serie):
return serie.shift(1).rolling(2, min_periods=1).mean()
df_total_by_group['month_rolling_mean_by_group'] = (df_total_by_group
.groupby(['group', 'month'])['value']
.transform(rolling_mean)
)
# display results
df_total_by_group.sort_values(by=['group', 'month'])
我得到了正确的结果,
但我需要它们作为原始数据帧中的列
我在这里迷路了。有什么建议吗?与列列表一起使用-此处缺少,因为两个数据帧的所有公共列都按Interscion合并:
df = df.merge(df_total_by_group[['group','date','month_rolling_mean_by_group']], how='left')
所以它的工作原理是一样的:
df = df.merge(df_total_by_group[['group','date','month_rolling_mean_by_group']],
how='left',
on=['group','date'])
print (df)
date value subgroup group month_rolling_mean_by_group
0 2017-01-01 100 subgroup1 group1 NaN
1 2017-01-01 200 subgroup2 group1 NaN
2 2017-02-01 100 subgroup1 group1 NaN
3 2017-02-01 200 subgroup2 group1 NaN
4 2018-01-01 200 subgroup1 group1 300.0
5 2018-01-01 400 subgroup2 group1 300.0
6 2018-02-01 200 subgroup1 group1 300.0
7 2018-02-01 400 subgroup2 group1 300.0
8 2019-01-01 300 subgroup1 group1 450.0
9 2019-01-01 600 subgroup2 group1 450.0
10 2019-02-01 300 subgroup1 group1 450.0
11 2019-02-01 600 subgroup2 group1 450.0
12 2017-01-01 200 subgroup1 group2 NaN
13 2017-01-01 400 subgroup2 group2 NaN
14 2017-02-01 200 subgroup1 group2 NaN
15 2017-02-01 400 subgroup2 group2 NaN
16 2018-01-01 400 subgroup1 group2 600.0
17 2018-01-01 800 subgroup2 group2 600.0
18 2018-02-01 400 subgroup1 group2 600.0
19 2018-02-01 800 subgroup2 group2 600.0
20 2019-01-01 600 subgroup1 group2 900.0
21 2019-01-01 1200 subgroup2 group2 900.0
22 2019-02-01 600 subgroup1 group2 900.0
23 2019-02-01 1200 subgroup2 group2 900.0
如果对第一次求和使用变换,则其工作方式不同:
df['value'] = df.groupby(['group', 'date'], as_index=False)['value'].transform('sum')
df['month'] = df['date'].dt.month
def rolling_mean(serie):
return serie.shift(1).rolling(2, min_periods=1).mean()
df['month_rolling_mean_by_group'] = (df.groupby(['group', 'month'])['value']
.transform(rolling_mean))
与列列表一起使用-此处缺少,因为通过Interscion合并两个数据帧的所有公共列:
df = df.merge(df_total_by_group[['group','date','month_rolling_mean_by_group']], how='left')
所以它的工作原理是一样的:
df = df.merge(df_total_by_group[['group','date','month_rolling_mean_by_group']],
how='left',
on=['group','date'])
print (df)
date value subgroup group month_rolling_mean_by_group
0 2017-01-01 100 subgroup1 group1 NaN
1 2017-01-01 200 subgroup2 group1 NaN
2 2017-02-01 100 subgroup1 group1 NaN
3 2017-02-01 200 subgroup2 group1 NaN
4 2018-01-01 200 subgroup1 group1 300.0
5 2018-01-01 400 subgroup2 group1 300.0
6 2018-02-01 200 subgroup1 group1 300.0
7 2018-02-01 400 subgroup2 group1 300.0
8 2019-01-01 300 subgroup1 group1 450.0
9 2019-01-01 600 subgroup2 group1 450.0
10 2019-02-01 300 subgroup1 group1 450.0
11 2019-02-01 600 subgroup2 group1 450.0
12 2017-01-01 200 subgroup1 group2 NaN
13 2017-01-01 400 subgroup2 group2 NaN
14 2017-02-01 200 subgroup1 group2 NaN
15 2017-02-01 400 subgroup2 group2 NaN
16 2018-01-01 400 subgroup1 group2 600.0
17 2018-01-01 800 subgroup2 group2 600.0
18 2018-02-01 400 subgroup1 group2 600.0
19 2018-02-01 800 subgroup2 group2 600.0
20 2019-01-01 600 subgroup1 group2 900.0
21 2019-01-01 1200 subgroup2 group2 900.0
22 2019-02-01 600 subgroup1 group2 900.0
23 2019-02-01 1200 subgroup2 group2 900.0
如果对第一次求和使用变换,则其工作方式不同:
df['value'] = df.groupby(['group', 'date'], as_index=False)['value'].transform('sum')
df['month'] = df['date'].dt.month
def rolling_mean(serie):
return serie.shift(1).rolling(2, min_periods=1).mean()
df['month_rolling_mean_by_group'] = (df.groupby(['group', 'month'])['value']
.transform(rolling_mean))
我一直在做的是为我的聚合创建一个新的数据帧,然后连接回原始数据帧
pd.merge(df1, df2, on=['group, 'date'], how='left')
我一直在做的是为我的聚合创建一个新的数据帧,然后连接回原始数据帧
pd.merge(df1, df2, on=['group, 'date'], how='left')
必须是['group',date']我认为这是一种新的方式来做它lol-也被编辑以包括date必须是['group',date']我认为这是一种新的方式来做它lol-也被编辑以包括date