首页 > 解决方案 > 按日期计算某些行的平均值并在 Python pandas 中创建新行

问题描述

我有一个以下数据框,我想在其中计算bubl层的平均值date并创建新行bu-bl_avg

date            layer       value       

12-05-2020      bu      85      
13-05-2020      bu      78
15-05-2020      bu      81      
16-06-2020      bu      98
12-05-2020      bl      124     
13-06-2020      bl      120
15-05-2020      bl      112     
16-06-2020      bl      121
18-05-2020      bk      100
19-05-2020      bk      105

结果应如下所示:

12-05-2020      bu-bl_avg   104.5
13-05-2020      bu-bl_avg   99
15-05-2020      bu-bl_avg   96.5
16-06-2020      bu-bl_avg   109.5
18-05-2020      bk          100
19-05-2020      bk          105

标签: pandas

解决方案


对于 100% 确定的仅聚合bu,bl值首先过滤行,聚合mean和最后附加不匹配的行concat

mask = df.layer.isin(['bu','bl'])

df1 = (df[mask].assign(layer = 'bu-bl_avg')
               .groupby(['date','layer'], as_index=False)['value']
               .mean())


df = pd.concat([df1, df[~mask]])
print (df)
         date      layer  value
0  12-05-2020  bu-bl_avg  104.5
1  13-05-2020  bu-bl_avg   78.0
2  13-06-2020  bu-bl_avg  120.0
3  15-05-2020  bu-bl_avg   96.5
4  16-06-2020  bu-bl_avg  109.5
8  18-05-2020         bk  100.0
9  19-05-2020         bk  105.0

如果可能的话,在替换bu, bl值之后聚合所有行(在实际数据中也应该聚合另一行!):

df.layer = df.layer.replace(['bu','bl'], 'bu-bl_avg')

df2 = (df.groupby(['date','layer'], as_index=False)['value']
               .mean())
print (df2)

         date      layer  value
0  12-05-2020  bu-bl_avg  104.5
1  13-05-2020  bu-bl_avg   78.0
2  13-06-2020  bu-bl_avg  120.0
3  15-05-2020  bu-bl_avg   96.5
4  16-06-2020  bu-bl_avg  109.5
5  18-05-2020         bk  100.0
6  19-05-2020         bk  105.0

推荐阅读