python pandas数据分组聚合
0 背景
上一篇我们已经完成了Pandas
的分组对象的创建和一些操作,这个分组对象包含了数据的分组详情, 以及对这个分组对象进行各种操作,并获取相关信息。本节将着重介绍分组数据后的统计分析,这是分组聚合过程的最终步骤。通过对最终数据的审视和输出,我们能够观察到业务的变化趋势,从而充分体现数据的价值和意义。
1 使用
导入数据/创建分组对象
import numpy as np
import pandas as pd
data = {'A': ['aa', 'ab', 'bc', 'bc', 'ab', 'bc'],
'B': [2, 2, 3, 5, 8, 5],
'C': [0.21, -1.08, -0.02, 0.68, 0.78, 0.23],
'D': [-0.86, -0.16, 0.74, 1.21, 1.18, 0.71],
'E': [2, 5, 7, 2, 4, 8]}
df = pd.DataFrame(data)
df
A B C D E
0 aa 2 0.21 -0.86 2
1 ab 2 -1.08 -0.16 5
2 bc 3 -0.02 0.74 7
3 bc 5 0.68 1.21 2
4 ab 8 0.78 1.18 4
5 bc 5 0.23 0.71 8
g = df.groupby('A')
描述性统计
# 描述性统计
g.describe()
# 由于结果过多,为便于观察,对结果进行转置
g.describe().T
# A aa ab bc
# B count 1.00 2.000000 3.000000
# mean 2.00 5.000000 4.333333
# std NaN 4.242641 1.154701
# min 2.00 2.000000 3.000000
# 25% 2.00 3.500000 4.000000
# 50% 2.00 5.000000 5.000000
# 75% 2.00 6.500000 5.000000
# max 2.00 8.000000 5.000000
# C count 1.00 2.000000 3.000000
# mean 0.21 -0.150000 0.296667
# std NaN 1.315219 0.354730
# min 0.21 -1.080000 -0.020000
# 25% 0.21 -0.615000 0.105000
# 50% 0.21 -0.150000 0.230000
# 75% 0.21 0.315000 0.455000
# max 0.21 0.780000 0.680000
# D count 1.00 2.000000 3.000000
# mean -0.86 0.510000 0.886667
# std NaN 0.947523 0.280416
# min -0.86 -0.160000 0.710000
# 25% -0.86 0.175000 0.725000
# 50% -0.86 0.510000 0.740000
# 75% -0.86 0.845000 0.975000
# max -0.86 1.180000 1.210000
# E count 1.00 2.000000 3.000000
# mean 2.00 4.500000 5.666667
# std NaN 0.707107 3.214550
# min 2.00 4.000000 2.000000
# 25% 2.00 4.250000 4.500000
# 50% 2.00 4.500000 7.000000
# 75% 2.00 4.750000 7.500000
统计函数
# 各组的平均值
g.mean()
# 描述性统计
g.describe()
# 求和
g.sum()
# 每组数量,不包括缺失值
g.count()
# 最大值
g.max()
# 最小值
g.min()
# 分组数量
g.size()
# 中位数
g.median()
# 标准差
g.std()
# 方差
g.var()
# 相关性系数
g.corr()
# 标准误差
g.sem()
# 乘积
g.prod()
# 每组的累计最大值
g.cummax()
# 累加
g.cumsum()
# 每组最大值、最小值所在的索引值
g.idxmax()
g.idxmin()
聚合方法agg()
聚合方法agg()
是方法.aggregate()
的简写. 它的作用是将分组后的对象按照给定的统计方法运行,也支持按字段分别给定不同的统计方法运行。
g.aggregate('mean')
g.agg('mean')
g.agg(np.mean)
# B C D E
# A
# aa 2.000000 0.210000 -0.860000 2.000000
# ab 5.000000 -0.150000 0.510000 4.500000
# bc 4.333333 0.296667 0.886667 5.666667
g['B'].agg('mean')
# A
# aa 2.000000
# ab 5.000000
# bc 4.333333
# Name: B, dtype: float64
g[['B', 'C']].agg(['mean', np.max, min])
# 可以通过多种形式获取各个字段的统计情况。
# B C
# mean max min mean max min
# A
# aa 2.000000 2 2 0.210000 0.21 0.21
# ab 5.000000 8 2 -0.150000 0.78 -1.08
# bc 4.333333 5 3 0.296667 0.68 -0.02
# 不同列使用不同计算方法,且一个列用多个计算方法
g.agg({'B': 'mean', 'C': ['count', 'max', 'sum']})
# B C
# mean count max sum
# A
# aa 2.000000 1 0.209521 0.209521
# ab 5.000000 2 0.782076 -0.295344
# bc 4.333333 3 0.682054 0.948482
g.agg({'B': 'mean', 'C': ['count', 'max', 'sum']}).columns
# MultiIndex([('B', 'mean'),
# ('C', 'count'),
# ('C', 'max'),
# ('C', 'sum')],
# )
分组内首尾值
# 分组内首位值
g.first()
# B C D E
# A
# aa 2 0.21 -0.86 2
# ab 2 -1.08 -0.16 5
# bc 3 -0.02 0.74 7
# numeric_only参数指定是否仅含数字, 默认是False, min_count表示组内的数量最少是多少, 默认是-1, 不限制
g.first(numeric_only=True, min_count=2)
# B C D E
# A
# aa NaN NaN NaN NaN
# ab 2.0 -1.08 -0.16 5.0
# bc 3.0 -0.02 0.74 7.0
g.last()
# B C D E
# A
# aa 2 0.21 -0.86 2
# ab 8 0.78 1.18 4
# bc 5 0.23 0.71 8
#
g.last(numeric_only=True, min_count=3)
# B C D E
# A
# aa NaN NaN NaN NaN
# ab NaN NaN NaN NaN
# bc 5.0 0.23 0.71 8.0
组内分位数
# 组内分位数
g.median()
# B C D E
# A
# aa 2.0 0.21 -0.86 2.0
# ab 5.0 -0.15 0.51 4.5
# bc 5.0 0.23 0.74 7.0
# 二分位数, 等同于中位数.
g.quantile()
# B C D E
# A
# aa 2.0 0.21 -0.86 2.0
# ab 5.0 -0.15 0.51 4.5
# bc 5.0 0.23 0.74 7.0
# n分位数, 设置参数q=0.5, 表示二分位数
g.quantile(0.5)
# B C D E
# A
# aa 2.0 0.21 -0.86 2.0
# ab 5.0 -0.15 0.51 4.5
# bc 5.0 0.23 0.74 7.0
组内差值
.diff()
是 pandas 中的一个方法,用于计算分组内元素的差异。当我们对一个分组对象调用 diff()
方法时,它会在每个分组内计算每个元素与前一个元素之间的差异。主要用于分析时间序列数据或需要比较分组内连续元素的情况。
# 组内差值
g.diff()
# B C D E
# 0 NaN NaN NaN NaN
# 1 NaN NaN NaN NaN
# 2 NaN NaN NaN NaN
# 3 2.0 0.70 0.47 -5.0
# 4 6.0 1.86 1.34 -1.0
# 5 0.0 -0.45 -0.50 6.0
2 总结
groupby
函数可以简单的理解为为拆开数据、应用数据和合并数据。本文介绍的功能主要是将分组的结果最终统计并展示出来。因此我们需要掌握熟练使用agg()
方法,它功能强大,是在我们今后的数据分析中主要的数据分组聚合工具。
欢迎关注我的微信公众号
原文始发于微信公众号(其之):python pandas数据分组聚合
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204769.html