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

如何使用pandas的Group by将DataFrame第二列设为列头、第三列作为单元格数据

长表转目标宽表的高效实现方案

该需求属于典型的长格式表转宽格式表场景,无需手动遍历拼接,直接使用pandas原生向量化方法即可实现高性能处理,大表下效率远高于循环操作。

方法1:无重复键时最优解:pivot()

适合(第一列, 第二列)组合完全唯一的场景,和示例输入完全匹配,参数直接对应需求维度:

  • index:原第一列Type,作为转换后的行标识
  • columns:原第二列Max Speed,其取值将作为新列名
  • values:原第三列Number,作为单元格取值
    最后通过reset_index()把行索引的Type转为普通列,再移除多余的列层级名,即可得到和示例完全一致的结果。

核心代码:

result_df = df.pivot(
    index="Type",
    columns="Max Speed",
    values="Number"
).reset_index()
# 移除列索引的层级名,对齐示例输出格式
result_df.columns.name = None

方法2:存在重复键时的稳妥方案:pivot_table()

如果数据中同一(Type, Max Speed)组合有多条记录,直接用pivot()会触发报错,此时用pivot_table()配合聚合逻辑处理,性能同样优秀。

核心代码:

result_df = df.pivot_table(
    index="Type",
    columns="Max Speed",
    values="Number",
    aggfunc="first"  # 可根据业务需求替换为sum、mean、max等聚合函数
).reset_index()
result_df.columns.name = None

等价索引操作写法:set_index + unstack

习惯用索引逻辑处理的话,该写法和pivot()效果完全一致:

result_df = df.set_index(["Type", "Max Speed"])["Number"].unstack("Max Speed").reset_index()
result_df.columns.name = None

注意:如果原Max Speed列存在缺失值,该部分取值会默认被过滤;如果对应Number取值缺失,转换后对应单元格会保留NaN。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 16:06:04