Pandas按id分组计算date=0的profit均值并填充至原表所有对应行
问题原因
你遇到的NaN问题是因为df_filter仅包含date==0的行,分组计算得到的结果只有df_filter对应索引位置有值,赋值回原DataFrame时,date==1的行没有匹配的索引值,所以自动填充为NaN。
实现方法
方法1:先计算id维度的均值映射,再全量匹配(最简洁)
先筛选date==0的行按id分组计算均值,再通过id列映射到原表所有行:
# 计算每个id对应的date=0的profit均值 id_profit_mean = df[df['date'] == 0].groupby('id')['profit'].mean() # 映射到原表所有行 df['affect'] = df['id'].map(id_profit_mean)
方法2:分组时直接指定计算规则,无需预筛选
直接对原表按id分组,在聚合逻辑里仅计算该分组下date=0行的均值,一次性生成全量的affect列:
df['affect'] = df.groupby('id')['profit'].transform( lambda x: x[df.loc[x.index, 'date'] == 0].mean() )
方法3:补全你已生成的含NaN的affect列
如果你已经按原有代码生成了带NaN的affect列,直接按id分组做前后填充即可(前提是每个id至少存在1条date=0的记录):
df['affect'] = df.groupby('id')['affect'].ffill().bfill()
以上三种方法都可以得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者Parlielion
相关产品推荐
相关产品推荐

