pandas中df.groupby()方法深入讲解
本文详细解析pandas中df.groupby()方法的用法。涵盖单列与多列分组、groupby对象特性,以及describe、value_counts、sum、mean、max等常用统计函数的应用。通过具体代码示例,展示如何对数值列和离散列进行组内统计,帮助读者掌握数据分组处理的核心技巧。
分组是指根据研究目的,将样本点依据一个或多个属性划分为若干组的过程。
在pandas库中,数据表对应DataFrame对象,而分组操作主要通过groupby方法实现。该方法将DataFrame中的行按照指定的一列或多列进行划分,使得列值相同的行归入同一组,列值不同的行则分属不同组。
执行分组操作后,会返回一个groupby对象,该对象代表了已划分好的各个组。后续的所有操作,如计数、求平均值等,均基于此groupby对象执行,即针对各个组分别进行计算。
分组的返回结果
df = pd.DataFrame([['a', 'man', 120, 90], ['b', 'woman', 130, 100], ['a', 'man', 110, 108], ['a', 'woman', 120, 118]], columns=['level', 'gender', 'math','chinese']) group = df.groupby('gender')
df.groupby()函数返回的对象由一系列键值对组成,其中键为分组的字段值,值为该字段值对应的数据子表。分组结果无法直接通过print()输出完整内容,print()仅显示该结果的数据类型。若要查看具体内容,需通过循环遍历分组后的结果。
print(group)
# <pandas.core.groupby.generic.DataFrameGroupBy object at 0x11cb60f50>
for key, value in group:
print(key)
print(value)
print("")
man
level gender math chinese
0 a man 120 90
2 a man 110 108
woman
level gender math chinese
1 b woman 130 100
3 a woman 120 118
按一列分组:df.groupby(column)
group = df.groupby('gender') # 按照'gender'列的值来分组,创建一个groupby对象
# group = df.groupby(['gender']) # 等价写法
for key, df in group:
print(key)
print(df)
man
level gender math chinese
0 a man 120 90
2 a man 110 108
woman
level gender math chinese
1 b woman 130 100
3 a woman 120 118
按多列分组:df.groupby([column1, column2])
group = df.groupby(['gender', 'level'])
# 先按照'grade'列的值来分组。每组内,再按'level'列来分组。也返回一个groupby对象
for key, value in group:
print(key)
print(value)
print("")
('man', 'a')
level gender math chinese
0 a man 120 90
2 a man 110 108
('woman', 'a')
level gender math chinese
3 a woman 120 118
('woman', 'b')
level gender math chinese
1 b woman 130 100
查看每组的统计数据:df.groupby(column).describe()
该操作对数据表中的数值列进行统计,输出信息包括count(计数)、mean(平均数)、std(标准差)、min(最小值)、25%(第一四分位数)、50%(中位数)、75%(第三四分位数)以及max(最大值)。非数值列不参与统计。
上述操作返回的数据类型为DataFrame。
查看所有列的统计信息
group = df.groupby(['gender'])
df1 = group.describe()
# df1 = df.groupby(['gender']).describe() # 等价写法
print(type(df1))
print(df1)
<class 'pandas.core.frame.DataFrame'>
math chinese \
count mean std min 25% 50% 75% max count
gender
man 2.0 115.0 7.071068 110.0 112.5 115.0 117.5 120.0 2.0
woman 2.0 125.0 7.071068 120.0 122.5 125.0 127.5 130.0 2.0
mean std min 25% 50% 75% max
gender
man 99.0 12.727922 90.0 94.5 99.0 103.5 108.0
woman 109.0 12.727922 100.0 104.5 109.0 113.5 118.0
查看指定列的统计信息
group = df.groupby(['gender'])
df1 = group.describe()['math'] # 只看math列的统计信息
print(df1)
count mean std min 25% 50% 75% max
gender
man 2.0 115.0 7.071068 110.0 112.5 115.0 117.5 120.0
woman 2.0 125.0 7.071068 120.0 122.5 125.0 127.5 130.0
查看纵向视图
unstack()方法可将每列的统计信息垂直排列展示。
group = df.groupby(['gender'])
df1 = group.describe().unstack()
print(df1)
gender
math count man 2.000000
woman 2.000000
...
max man 120.000000
woman 130.000000
chinese count man 2.000000
woman 2.000000
...
woman 113.500000
max man 108.000000
woman 118.000000
dtype: float64
组内离散列计数:df.groupby(column)[column2].value_counts()
数据表的列按值是否连续可分为连续值列和离散值列。对于离散值列,可统计其不重复值的个数;对于连续值列,统计不重复值通常意义不大。该统计结果返回一个Series对象。
group = df.groupby(['gender'])
df1 = group['level'].value_counts() # 统计'level'列的不重复值个数
print(type(df1))
print(df1)
<class 'pandas.core.series.Series'>
gender level
man a 2
woman a 1
b 1py
Name: level, dtype: int64
组内数值列求和:df.groupby(column).sum()
group = df.groupby(['gender'])
df1 = group.sum()
print(df1)
math chinese
gender
man 230 198
woman 250 218
组内成员数统计:df.groupby(column).count()
此操作统计每组内各列的成员数量,每列的统计结果一致。
group = df.groupby(['gender'])
df1 = group.count()
print(df1)
level math chinese
gender
man 2 2 2
woman 2 2 2
组内数值列求均值:df.groupby(column).mean()
此操作统计每组内所有数值列的均值,非数值列无均值结果。
计算所有组的均值
group = df.groupby(['gender'])
df1 = group.mean()
print(df1)
math chinese
gender
man 115 99
woman 125 109
计算单个组的均值
group = df.groupby(['gender'])
df1 = group['math'].mean()
print(df1)
gender
man 115
woman 125
Name: math, dtype: int64
组内数值列求最大值:df.groupby(column).max()
此操作统计每组内所有数值列的最大值,非数值列无最大值结果。
统计所有数值列的最大值
group = df.groupby(['gender'])
df1 = group.max()
print(df1)
level math chinese
gender
man a 120 108
woman b 130 118
统计单个数值列的最大值
group = df.groupby(['gender'])
df1 = group['math'].max()
print(df1)
gender
man 120
woman 130
Name: math, dtype: int64
组内应用自定义函数:df.groupby(column1)[column2].apply()
group = df.groupby(['gender'])
df1 = group['math'].apply(np.mean) # 求组内均值
print(df1)
gender
man 115.0
woman 125.0
Name: math, dtype: float64
组内不同列应用不同函数:df.groupby(column).agg({column1:func, column2:func,…})
group = df.groupby(['gender'])
df1 = group.agg({'math':np.mean, 'chinese':np.std})
print(df1)
math chinese
gender
man 115 12.727922
woman 125 12.727922
总结
至此,关于pandas中df.groupby()方法的讲解已完成。如需了解更多相关pandas df.groupby()方法内容,请搜索本站历史文章或继续浏览后续相关文章。感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









