当前位置: 首页 > 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.dtcms.com/a/342592.html

相关文章:

  • 如何用算力魔方4060安装PaddleOCR MCP 服务器
  • 实现自己的AI视频监控系统-第一章-视频拉流与解码3
  • JavaWeb前端03(Ajax概念及在前端开发时应用)
  • Windows下,将本地视频转化成rtsp推流的方法
  • 高效处理NetCDF文件经纬度转换:一个纯CDO驱动的Bash脚本详解
  • GitHub 热榜项目 - 日榜(2025-08-21)
  • 009.Redis Predixy + Sentinel 架构
  • 深度卷积神经网络AlexNet
  • 【NVIDIA-B200】生产报错 Test CUDA failure common.cu:1035 ‘system not yet initialized‘
  • Docker 搭建 Gitlab 实现自动部署Vue项目
  • NW755NW776美光固态闪存NW863NX595
  • 【永洪BI】报告脚本-JavaScript使用【完整版】
  • Vue 项目中父子传值使用Vuex异步数据不更新问题
  • Postman来做API安全测试:身份验证缺陷漏洞测试
  • 药品追溯码(溯源码)采集系统(二):门诊发药后端
  • 【Linux系统】进程信号:信号的产生和保存
  • 使用EasyExcel 导出复杂的合并单元格
  • 第四届中国高校机器人实验教学创新大赛团队参赛总结
  • selenium一些进阶方法如何使用
  • 大模型0基础开发入门与实践:第11章 进阶:LangChain与外部工具调用
  • 打破传统课程模式,IP变现的创新玩法 | 创客匠人
  • 从零开始学 Selenium:浏览器驱动、元素定位与实战技巧
  • 微服务:现代软件架构的主流范式
  • Linux mmap内存映射
  • 集中式负载均衡 vs. 分布式负载均衡
  • 【赵渝强老师】Redis Cluster分布式集群
  • #千问海报大赛
  • 订单簿动力学与深度学习模型的融合大单识别与短期市场价格波动预测
  • Java多线程编程基础篇
  • 多级缓存一致性矩阵:ABP vNext 下的旁路 / 写穿 / 写回组合实战