如何使用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
相关产品推荐
相关产品推荐

