Pandas 的透视与逆透视
目录
1. 透视
1.1 pivot
1.2 pivot_table
2.逆透视
1. 透视
透视是长表变宽表。
pivot() 和 pivot_table()两个函数都可以做到,后者可以聚合前者不行。
特性 | df.pivot() | df.pivot_table() |
---|---|---|
重复值处理 | 要求索引和列的组合唯一,否则报错 ValueError | 允许重复值,通过聚合函数(如均值、求和等)处理 |
聚合功能 | 不支持聚合,仅用于数据重组 | 支持聚合(默认 aggfunc='mean' ) |
多值列处理 | 无法处理多值列(需唯一索引-列组合) | 自动聚合多值(如求和、均值等) |
灵活性 | 简单场景适用(无重复值) | 复杂场景适用(支持重复值和自定义聚合) |
示例数据:
import pandas as pddata = {'Year': [2020, 2020, 2021, 2021, 2020, 2020],'Product': ['A', 'A', 'A', 'B', 'B', 'B'],'Region': ['East', 'West', 'East', 'West', 'East', 'West'],'Sales': [100, 150, 200, 50, 120, 90]
}
df = pd.DataFrame(data)
原表:
1.1 pivot
参数 | 说明 | 默认值 | 示例 |
---|---|---|---|
index | 作为行索引的列名(可以是单个列名或列表) | None | index='Region' |
columns | 作为列名的列名(可以是单个列名或列表) | None | columns='Year' |
values | 作为填充值的列名(可以是单个列名或列表,选填) | None | values='Sales' |
指定index是转换后的索引,不能重复,如果单独是Year 则会报错:
ValueError: Index contains duplicate entries, cannot reshape
重置一下行索引:
1.2 pivot_table
参数 | 说明 | 默认值 | 示例 |
---|---|---|---|
index | 作为行索引的列名(可以是单个列名或列表) | None | index='Region' |
columns | 作为列名的列名(可以是单个列名或列表) | None | columns='Year' |
values | 作为填充值的列名(可以是单个列名或列表,选填) | None | values='Sales' |
aggfunc | 聚合函数(如 'sum' , 'mean' , 'count' 或自定义函数) | 'mean' | aggfunc='sum' |
fill_value | 填充缺失值的值 | None | fill_value=0 |
margins | 是否添加总计行/列(True /False ) | False | margins=True |
margins_name | 总计行/列的标签名 | 'All' | margins_name='Total' |
dropna | 是否删除全为 NaN 的列(True /False ) | True | dropna=False |
index指定的索引值可以重复,相当于根据该值进行分组,自动进行聚合(默认聚合函数median)例子以地区为索引,以Year为列,求每年的Sales的均值
2. 自定义聚合函数
同样重置索引:
2.逆透视
melt()函数,指定宽表变长表
参数 | 说明 | 默认值 | 示例 |
---|---|---|---|
id_vars | 保留的标识列(不参与转换,可以是单个列名或列表) | None | id_vars=['Year', 'Product'] |
value_vars | 需要转换的列(可以是单个列名或列表,默认转换所有非 id_vars 列) | None | value_vars=['Sales'] |
var_name | 存储原列名的列名(新生成的“变量列”) | 'variable' | var_name='Category' |
value_name | 存储原列值的列名(新生成的“值列”) | 'value' | value_name='Revenue' |
col_level | 多层列索引时指定要转换的层级(用于 MultiIndex 列) | None | col_level=0 |
以上面透视的结果为例:
逆透视: