18-Pandas groupby分组操作

Pandas groupby分组操作详解

在数据分析中,经常会遇到这样的情况:根据某一列(或多列)标签把数据划分为不同的组别,然后再对其进行数据分析。比如,某网站对注册用户的性别或者年龄等进行分组,从而研究出网站用户的画像(特点)。在 Pandas 中,要完成数据的分组操作,需要使用 groupby() 函数,它和 SQL 的GROUP BY操作非常相似。

在划分出来的组(group)上应用一些统计函数,从而达到数据分析的目的,比如对分组数据进行聚合、转换,或者过滤。这个过程主要包含以下三步:

  • 拆分(Spliting):表示对数据进行分组;
  • 应用(Applying):对分组数据应用聚合函数,进行相应计算;
  • 合并(Combining):最后汇总计算结果。

下面对 groupby() 函数的应用过程进行具体的讲解。

创建DataFrame对象

提供数据:empdata.csv:

EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO
7369,SMITH,CLERK,7902.0,1980-12-17,800,,20
7499,ALLEN,SALESMAN,7698.0,1981-02-20,1600,300.0,30
7521,WARD,SALESMAN,7698.0,1981-02-22,1250,500.0,30
7566,JONES,MANAGER,7839.0,1981-04-02,2975,,20
7654,MARTIN,SALESMAN,7698.0,1981-09-28,1250,1400.0,30
7698,BLAKE,MANAGER,7839.0,1981-05-01,2850,,30
7782,CLARK,MANAGER,7839.0,1981-06-09,2450,,10
7788,SCOTT,ANALYST,7566.0,1987-04-19,3000,,20
7839,KING,PRESIDENT,,1981-11-17,5000,,10
7844,TURNER,SALESMAN,7698.0,1981-09-08,1500,0.0,30
7876,ADAMS,CLERK,7788.0,1987-05-23,1100,,20
7900,JAMES,CLERK,7698.0,1981-12-03,950,,30
7902,FORD,ANALYST,7566.0,1981-12-03,3000,,20
7934,MILLER,CLERK,7782.0,1982-01-23,1300,,10

首先我们创建一个 DataFrame 对象,下面数据描述了某公司员工信息:

import pandas as pd
import numpy as np
df  = pd.read_csv('C:\\Users\\qwy\Desktop\data\\empdata.csv')
print(df)

输出结果:

    EMPNO   ENAME        JOB     MGR    HIREDATE   SAL    COMM  DEPTNO
0    7369   SMITH      CLERK  7902.0  1980-12-17   800     NaN      20
1    7499   ALLEN   SALESMAN  7698.0  1981-02-20  1600   300.0      30
2    7521    WARD   SALESMAN  7698.0  1981-02-22  1250   500.0      30
3    7566   JONES    MANAGER  7839.0  1981-04-02  2975     NaN      20
4    7654  MARTIN   SALESMAN  7698.0  1981-09-28  1250  1400.0      30
5    7698   BLAKE    MANAGER  7839.0  1981-05-01  2850     NaN      30
6    7782   CLARK    MANAGER  7839.0  1981-06-09  2450     NaN      10
7    7788   SCOTT    ANALYST  7566.0  1987-04-19  3000     NaN      20
8    7839    KING  PRESIDENT     NaN  1981-11-17  5000     NaN      10
9    7844  TURNER   SALESMAN  7698.0  1981-09-08  1500     0.0      30
10   7876   ADAMS      CLERK  7788.0  1987-05-23  1100     NaN      20
11   7900   JAMES      CLERK  7698.0  1981-12-03   950     NaN      30
12   7902    FORD    ANALYST  7566.0  1981-12-03  3000     NaN      20
13   7934  MILLER      CLERK  7782.0  1982-01-23  1300     NaN      10

创建groupby分组对象

使用 groupby() 可以沿着任意轴分组。您可以把分组时指定的键(key)作为每组的组名,方法如下所示:

  • df.groupby(“key”)
  • df.groupby(“key”,axis=1)
  • df.groupby([“key1”,“key2”])

通过上述方法对 DataFrame 对象进行分组操作:

import pandas as pd
import numpy as np
df  = pd.read_csv('C:\\Users\\qwy\Desktop\data\\empdata.csv')
print("按照部门编号分组:\n",df.groupby("DEPTNO"))

输出结果:

按照部门编号分组:
 <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000020F2B536070>

查看分组结果

1) groups查看分组结果

通过调用groups属性查看分组结果:

import pandas as pd
import numpy as np
df  = pd.read_csv(
<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、付费专栏及课程。

余额充值