当前位置: 首页 > news >正文

Python-Pandas GroupBy 进阶与透视表学习

​一、数据分组(GroupBy)​

​核心概念​​:将数据按指定字段分组,对每组进行聚合、转换或过滤操作。

​1. 分组聚合(Aggregation)​

将分组数据聚合成单个值(如平均值、总和)。

  • ​单变量分组聚合​​:

    import pandas as pd  
    df = pd.read_csv('data/gapminder.tsv', sep='\t')  
    # 按年份分组计算平均寿命  
    result = df.groupby('year')['lifeExp'].mean()
  • ​Pandas内置聚合方法​​:

    • count(), mean(), std(), median(), sum(), min(), max()等。

    • 示例:

      df.groupby('continent')['lifeExp'].describe()  # 同时计算多个统计量
  • ​自定义聚合函数​​:

    def my_mean(values):  return sum(values) / len(values)  
    # 使用agg调用自定义函数  
    df.groupby('year')['lifeExp'].agg(my_mean)
  • ​多函数聚合​​:

    result = df.groupby('year')['lifeExp'].agg(['count', 'mean', 'std'])  
    # 重命名结果列  
    result.columns = ['count_nonzero', 'mean', 'std']
  • ​多列不同聚合操作​​:

    df.groupby('year').agg({  'lifeExp': 'mean',  'pop': 'median',  'gdpPercap': 'median'  
    }).rename(columns={  'lifeExp': '平均寿命',  'pop': '人口',  'gdpPercap': '人均Gdp'  
    }).reset_index()

​2. 分组转换(Transformation)​

保持数据维度不变,对每组进行转换(如标准化、填充缺失值)。

  • ​计算Z分数​​:

    def my_zscore(x):  return (x - x.mean()) / x.std()  
    df['z_score'] = df.groupby('year')['lifeExp'].transform(my_zscore)
  • ​分组填充缺失值​​:

    tips = pd.read_csv('data/tips.csv').sample(10, random_state=42)  
    tips.loc[np.random.permutation(tips.index)[:4], 'total_bill'] = np.NaN  # 构造缺失值  def fill_na_mean(x):  return x.fillna(x.mean())  # 用组内均值填充缺失值  tips['fill_total_bill'] = tips.groupby('sex')['total_bill'].transform(fill_na_mean)

​3. 分组过滤(Filtration)​

根据条件筛选分组(如删除组内数据量不足的分组)。

# 过滤组内数据量>30的分组  
tips_filtered = tips.groupby('size').filter(lambda x: len(x) > 30)  
tips_filtered['size'].value_counts()

​4. DataFrameGroupBy对象操作​

分组后返回DataFrameGroupBy对象,支持进一步操作。

  • ​查看分组​​:

    grouped = tips.groupby('sex')  
    grouped.groups  # 显示分组索引  
    female_group = grouped.get_group('Female')  # 提取特定组
  • ​遍历分组​​:

    for name, group in grouped:  print(f"Group: {name}")  print(group.head())
  • ​多字段分组​​:

    group_avg = tips.groupby(['sex', 'time']).mean()  # 返回MultiIndex  
    group_avg.reset_index()  # 转换为普通DataFrame  
    # 或分组时禁用索引  
    tips.groupby(['sex', 'time'], as_index=False).mean()

​二、数据透视表(Pivot Table)​

动态重组数据,按行列维度聚合分析。

​核心参数​

参数

作用

示例

index

行分组字段

index='continent'

columns

列分组字段

columns='year'

values

待聚合的数值列

values='lifeExp'

aggfunc

聚合函数(默认mean

aggfunc=['mean', 'std']

​基础用法​
# 按大洲和年份透视平均寿命  
pivot = pd.pivot_table(  df,  index='continent',  columns='year',  values='lifeExp',  aggfunc='mean'  
)
​多维度聚合​
# 同时计算均值和标准差  
pivot_multi = pd.pivot_table(  df,  index='continent',  columns='year',  values='lifeExp',  aggfunc=['mean', 'std']  
)

​三、关键区别总结​

​操作​

​输入​

​输出​

​特点​

​聚合(Agg)​

每组数据

​单个值​​(如均值)

数据维度降低

​转换(Transform)​

每组数据

​同维度数据​​(如Z分数)

维度不变,支持向量化操作

​过滤(Filter)​

整组数据

​筛选后的组​​(如删除小组)

按组条件筛选

​透视表​

全表数据

​重组后的聚合表​

动态行列分析,支持多级分组


​四、最佳实践​
  1. ​分组前预处理​​:确保分组字段无缺失值。

  2. ​优先内置函数​​:如mean()比自定义循环高效。

  3. ​透视表替代多重分组​​:简化多维度聚合代码。

  4. ​利用reset_index()​:将分组索引转换为列便于后续分析。

示例代码需结合实际数据文件运行,建议在Jupyter Notebook中逐步练习以加深理解。

http://www.xdnf.cn/news/1338715.html

相关文章:

  • 中国之路 向善而行 第三届全国自驾露营旅游发展大会在阿拉善启幕
  • Android14内核调试 - boot vendor_boot
  • 06高级语言逻辑结构到汇编语言之逻辑结构转换 for (...; ...; ...)
  • uni-app:实现文本框的自动换行
  • Android - 资源类型 MINE Type
  • 教育场景下禁用html5播放器拖动进度条的例子
  • 医疗信息化实战:引领医疗行业数字化转型实践
  • 华为AUTOSAR质量目标与开发实践
  • FCN网络结构讲解与Pytorch逐行讲解实现
  • Go语言中的迭代器模式与安全访问实践
  • open3d-点云函数:变换:旋转,缩放、平移,齐次变换(R,T)等
  • 开源,LangExtract-Python库用LLM从非结构化文本提取结构化信息
  • 移动应用抓包与调试实战 Charles工具在iOS和Android中的应用
  • 自然语言处理——04 注意力机制
  • 基于Spring Cloud Gateway动态路由与灰度发布方案对比与实践指导
  • 记一次 .NET 某光谱检测软件 内存暴涨分析
  • CentOS7安装部署PostgreSQL
  • 搭建FTP文件共享服务器
  • SQL中对视图的操作命令汇总
  • 【数据结构入门】排序算法:插入排序
  • 带有 Angular V14 的 Highcharts
  • 动学学深度学习03-线性神经网络
  • hadoop-3.3.6和hbase-2.4.13
  • Linux下Docker版本升级保姆攻略
  • 数据结构之排序大全(4)
  • LLaVA-3D,Video-3D LLM,VG-LLM,SPAR论文解读
  • WebSocket通信:sockjs与stomp.js的完美搭档
  • 【问题思考】为什么需要文件后缀?(gemini完成)
  • Web3 的发展挑战:技术、监管与生态的多重困境
  • 机器学习聚类算法