df.groupby()方法讲解

df.groupby()方法讲解

分组:根据研究目的,将所有样本点按照一个或多个属性划分为多个组,就是分组。

pandas中,数据表就是DataFrame对象,分组就是groupby方法。将DataFrame中所有行按照一列或多列来划分,分为多个组,列值相同的在同一组,列值不同的在不同组。

分组后,就得到一个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(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
<think>嗯,用户想了解如何使用Pandasgroupby分组操作,以及常见用法。首先,我需要回忆一下Pandasgroupby的基本概念和步骤。根据引用[3],groupby对象包含分组键、分组迭代器和分组操作。用户可能需要知道如何创建分组,然后应用聚合函数或者进行其他操作。 首先,应该从基础的分组步骤开始。比如,导入数据,然后按某一列分组。比如使用df.groupby('列名'),然后可能需要对分组后的数据进行聚合,比如sum、mean等。引用[2]提到创建频率表,这可能涉及到分组后使用size或count方法。 然后,可能需要讲解不同的分组方式,比如单列分组、多列分组,或者使用自定义函数分组。比如按性别分组,或者同时按性别和年龄分组。这部分需要示例代码,比如grouped = df.groupby(['gender', 'age_group']),然后展示如何聚合。 接下来是常见的聚合函数,比如sum、mean、max等。用户可能还需要知道如何同时应用多个聚合函数,使用agg方法,比如agg(['sum', 'mean'])。或者对不同的列应用不同的聚合,比如{'score': 'mean', 'income': 'sum'}。 然后,引用[1]提到了apply方法,可能需要说明groupby后如何结合apply进行更复杂的操作。比如对每个分组进行标准化处理,或者自定义函数应用。例如,分组后对每个组的分数进行z-score标准化。 此外,引用[3]还提到分组后的迭代,用户可以遍历分组对象获取每个组的名称和数据。这部分可以给出一个for循环的示例,比如for name, group in grouped:。 还需要注意一些常见问题,比如分组后的索引处理,使用as_index参数,或者用reset_index()将分组键转换为列。比如grouped = df.groupby('gender', as_index=False).mean()。 用户可能遇到的困难包括分组键的选择,处理多级索引,以及如何高效地进行分组聚合。可能需要提到性能优化,比如使用更高效的分组方法,或者避免在分组时复制数据。 最后,生成相关问题的时候,需要覆盖用户可能进一步想了解的内容,比如分组后的过滤、转换,或者时间序列分组,以及性能优化技巧。比如如何使用filter方法筛选分组,或使用transform进行组内转换。</think>### 使用Pandas实现groupby分组及常见用法 #### 1. **基础分组操作** 分组操作的核心是`groupby()`方法,按指定列或条件将数据拆分为多个子集。例如,按`gender`列分组: ```python import pandas as pd # 示例数据 data = {'gender': ['M', 'F', 'M', 'F'], 'score': [85, 90, 78, 88], 'income': [5000, 6000, 5500, 6200]} df = pd.DataFrame(data) # 按gender分组 grouped = df.groupby('gender') ``` #### 2. **常见聚合操作** 分组后可通过聚合函数(如`sum`、`mean`、`max`)计算统计值: ```python # 计算每组的平均分和总收入 result = grouped.agg({'score': 'mean', 'income': 'sum'}) # 输出: # score income # gender # F 89.0 12200 # M 81.5 10500 ``` 引用[^2]中提到,`agg()`可同时应用多个函数,例如: ```python grouped['score'].agg(['mean', 'max', 'count']) ``` #### 3. **多列分组与多级索引** 可按多列组合分组,生成分层索引: ```python # 添加年龄组列 df['age_group'] = ['20-30', '30-40', '20-30', '30-40'] grouped_multi = df.groupby(['gender', 'age_group']) # 计算每组收入均值 grouped_multi['income'].mean() ``` #### 4. **分组后迭代与过滤** - **迭代访问分组**:可通过循环遍历每个分组: ```python for name, group in grouped: print(f"Group: {name}") print(group) ``` - **过滤数据**:使用`filter()`筛选满足条件的分组(如保留组内数据量>1的分组): ```python filtered = grouped.filter(lambda x: len(x) > 1) ``` #### 5. **应用自定义函数** 结合`apply()`实现复杂操作,例如对每组数据标准化: ```python def z_score(group): return (group - group.mean()) / group.std() df['score_normalized'] = grouped['score'].apply(z_score) ``` 引用[^1]指出,`apply()`方法数据分析中非常灵活,适用于非聚合场景。 #### 6. **分组统计与频率表** 生成频率表(某列值的分布统计): ```python # 统计gender列的频数 frequency = df.groupby('gender').size() # 输出: # gender # F 2 # M 2 ``` #### 7. **分组键与索引控制** 分组后默认将分组列设为索引,可用`as_index=False`保留为普通列: ```python grouped = df.groupby('gender', as_index=False).mean() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值