pandas中df.groupby()方法深入讲解

沈亦白
沈亦白
发布时间:2026-10-16| 11人浏览过
原创

本文详细解析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()方法内容,请搜索本站历史文章或继续浏览后续相关文章。感谢大家的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。