如何将DataFrame的category列值转为列,并按id分组计算value列平均值
问题
我有一个名为df的Pandas DataFrame,结构如下:
| id | value | category |
|---|---|---|
| AB | 2 | small |
| BC | 3 | big |
| AB | 4 | small |
| AB | 5 | big |
| BC | 6 | small |
| BC | 2 | small |
| BC | 4 | big |
| AB | 8 | big |
需要按id分组,将category的不同取值作为列,列值为对应value的平均值,最终得到如下结构的DataFrame(注:原始数据中AB的small类平均值应为3,big类平均值应为6.5,以下为修正后的正确结果):
| ID | small | big |
|---|---|---|
| AB | 3 | 6.5 |
| BC | 4 | 3.5 |
解决方案
方法1:使用pivot_table
pivot_table是Pandas处理这类行列转换的常用方法,直接指定索引、列、值和聚合函数即可:
import pandas as pd # 生成结果 result = df.pivot_table( index='id', columns='category', values='value', aggfunc='mean' ).reset_index() # 调整格式匹配目标 result.columns.name = None # 移除列索引的名称 result = result.rename(columns={'id': 'ID'}) # 修改id列名为ID
方法2:使用groupby + unstack
先按id和category分组计算平均值,再通过unstack将category转换为列:
result = df.groupby(['id', 'category'])['value'].mean().unstack().reset_index() result.columns.name = None result = result.rename(columns={'id': 'ID'})
两种方法最终都会得到符合需求的DataFrame。
内容的提问来源于stack exchange,提问作者Datalearner
相关产品推荐
相关产品推荐

