You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选并重组Pandas DataFrame?透视表是否可行?

Pandas DataFrame 转换方案:透视表及更优替代

核心场景:长表↔宽表转换

大部分这类需求都是长表与宽表的互转,以下是针对不同场景的高效实现方案:


1. 长表转宽表(最常见需求)

如果你的原DataFrame是长格式(每行是一条属性记录),目标是转成宽格式(每行是一个主体的所有属性),优先用这几种方法:

方法1:pivot(无重复组合时首选)

语法简洁,性能最优,适合index+columns组合无重复的场景:

import pandas as pd

# 示例原长表df
df = pd.DataFrame({
    '用户ID': ['A', 'A', 'B', 'B'],
    '指标': ['年龄', '性别', '年龄', '性别'],
    '值': [25, '男', 30, '女']
})

# 转换为宽表df2
df2 = df.pivot(index='用户ID', columns='指标', values='值').reset_index()
df2.columns.name = None  # 移除列名的层级标签

输出的df2:

用户ID  年龄 性别
0    A  25  男
1    B  30  女

方法2:pivot_table(处理重复组合)

如果index+columns存在重复行,需要聚合取值(比如求和、均值),用pivot_table:

# 含重复记录的原df
df = pd.DataFrame({
    '用户ID': ['A', 'A', 'A', 'B'],
    '指标': ['年龄', '年龄', '性别', '年龄'],
    '值': [25, 26, '男', 30]
})

# 以均值聚合重复的年龄数据
df2 = df.pivot_table(
    index='用户ID',
    columns='指标',
    values='值',
    aggfunc='mean'  # 可替换为sum、first等聚合函数
).reset_index()
df2.columns.name = None

方法3:set_index + unstack(复杂多索引场景)

灵活性极强,适合包含多级索引/列的复杂转换,性能与pivot相当:

df2 = df.set_index(['用户ID', '指标'])['值'].unstack().reset_index()
df2.columns.name = None

2. 宽表转长表

如果需求是宽表转长表,用melt是标准方案:

# 示例原宽表df
df = pd.DataFrame({
    '用户ID': ['A', 'B'],
    '年龄': [25, 30],
    '性别': ['男', '女']
})

# 转换为长表df2
df2 = df.melt(
    id_vars='用户ID',  # 保留作为标识的列
    var_name='指标',   # 原列名转为新列的名称
    value_name='值'    # 原单元格值转为新列的名称
)

方案选择建议

  • 无重复记录的长转宽:优先用pivot,最快最简洁
  • 有重复记录需要聚合:用pivot_table
  • 复杂多索引/列转换:用set_index + unstack
  • 宽转长:直接用melt

如果你的DataFrame有特殊结构(比如多级列、复合索引),可以补充具体的样本数据,能给出更精准的实现代码。

内容的提问来源于stack exchange,提问作者Aragorn64

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:30:53