说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本需求是对一个 DataFrame,按分组进行统计平均值和标准差,主要来学习分组聚合操作以及再对数据堆叠,形成我们想要的结构。
源数据如下:
import pandas as pd
df = pd.DataFrame({'name': ['a', 'a', 'a', 'b', 'b'],
'subname': ['b', 'b', 'b', 'b', 'b'],
'value1': [1, 2, 3, 4, 5],
'value2': [1, 3, 5, 7, 9],
'value3': [2, 4, 6, 8, 0]})
df
'''
name subname value1 value2 value3
0 a b 1 1 2
1 a b 2 3 4
2 a b 3 5 6
3 b b 4 7 8
4 b b 5 9 0
'''
需求为按 name、subname,增加一列 type 为 value1 到 value3 列名,后边两列为对应分组对应列的平均值和标准差,形成一个描述统计表。效果如:
'''
name subname type mean std
0 a b value1 2.0 1.000000
1 a b value2 3.0 2.000000
2 a b value3 4.0 2.000000
3 b b value1 4.5 0.707107
4 b b value2 8.0 1.414214
5 b b value3 4.0 5.656854
'''
先用 groupby 分组数据,再用分组对象的 agg 来聚合平均值和标准差,最后堆叠数据,便可完成。
先分组,用 agg 聚合非分组列的平均值和标准差:
(
df.groupby(['name', 'subname'])
.agg(['mean', 'std'])
)
'''
value1 value2 value3
mean std mean std mean std
name subname
a b 2.0 1.000000 3.0 2.000000 4.0 2.000000
b b 4.5 0.707107 8.0 1.414214 4.0 5.656854
'''
修改索引名并堆叠数据,堆叠时按第一级索引(最右侧的索引)进行:
(
df.groupby(['name', 'subname'])
.agg(['mean', 'std'])
.rename_axis(['type', None], axis=1)
.stack(0)
)
'''
mean std
name subname type
a b value1 2.0 1.000000
value2 3.0 2.000000
value3 4.0 2.000000
b b value1 4.5 0.707107
value2 8.0 1.414214
value3 4.0 5.656854
'''
最后重置索引:
(
df.groupby(['name', 'subname'])
.agg(['mean', 'std'])
.rename_axis(['type', None], axis=1)
.stack(0)
.reset_index()
)
'''
name subname type mean std
0 a b value1 2.0 1.000000
1 a b value2 3.0 2.000000
2 a b value3 4.0 2.000000
3 b b value1 4.5 0.707107
4 b b value2 8.0 1.414214
5 b b value3 4.0 5.656854
'''
这样就实现了需求。
(完)
更新时间:2024-08-18 16:17:47 标签:pandas python 统计