CodeWalk

Pandas pivot_table与melt实现数据透视与逆透视

作者:我还是少年 · 2026-05-30 12:55

请说明Pandas中pivot_table()melt()的用法和适用场景。给出以下转换的代码:

  1. 将长格式数据转为宽格式(稀疏矩阵转交叉表)
  2. 将宽格式数据转为长格式(适合seaborn绘图)
  3. 多个聚合值同时透视
  4. 处理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')