Pandas pivot_table与melt实现数据透视与逆透视
请说明Pandas中pivot_table()和melt()的用法和适用场景。给出以下转换的代码:
- 将长格式数据转为宽格式(稀疏矩阵转交叉表)
- 将宽格式数据转为长格式(适合seaborn绘图)
- 多个聚合值同时透视
- 处理pivot时的重复索引错误
对比pivot()与pivot_table()的区别。
回答
我还是少年
pivot() vs pivot_table():
pivot():不允许重复聚合,有重复值抛错pivot_table():允许重复,自动聚(默认mean),功能更强大
# 1. 长→宽(透视表)
df = pd.DataFrame({'date': ['2024-01','2024-01','2024-02','2024-02'],
'city': ['BJ','SH','BJ','SH'],
'sales': [100, 150, 120, 180]})
wide = df.pivot_table(index='date', columns='city', values='sales', aggfunc='sum')
# 2. 宽→长(逆透视/melt)
wide.reset_index().melt(id_vars='date', var_name='city', value_name='sales')
# 3. 多值聚合
wide_multi = df.pivot_table(index='date', columns='city',
values=['sales', 'profit'],
aggfunc={'sales': 'sum', 'profit': 'mean'})
# 4. 处理重复索引
# 用pivot_table替代pivot,或先groupby去重
使用场景:
pivot_table:数据汇总报表、交叉分析melt:数据清洗、宽表转标准tidy data供绘图/建模crosstab():pivot_table的特化版,专门计算频数
pd.crosstab(index=df['date'], columns=df['city'], values=df['sales'], aggfunc='sum')