pandas - 按日期计算某些行的平均值并在 Python pandas 中创建新行
问题描述
我有一个以下数据框,我想在其中计算bu
和bl
层的平均值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
解决方案
对于 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
推荐阅读
- spring-boot - JpaRepository 一对多列表查询无法正常工作
- python - 如何判断 PyObject 的类型?
- oracle - 避免更新死锁
- php - 加载phpmyadmin时如何修复解析错误?
- ruby-on-rails - 如何获取使用 Nokogiri 一段时间后加载的 div 标签
- scala - 查找 Spark 数据框中非空值的计数
- flutter - 我在颤振中有一个 ExpansionTile。我想删除展开的字幕部分
- c# - 如何使用 NCrypt 通过包装(加密)导出私钥
- python - 如何在 QT-Designer 中添加新的小部件插件
- android-studio - 如何在 Flutter 中更改 Swiper 分页颜色?