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

如何在Pandas中按原列序将同ID记录转为列而非行?

解决Pandas透视后列顺序不符的问题

要实现FirstName、LastName、Salary、CAR循环的列顺序,核心是自定义生成目标列名序列,而非依赖sort_index的默认排序逻辑。以下是修改后的完整代码:

import pandas as pd

df = pd.DataFrame({
'ID':[33,33,3,21,21,3,33],
'FirstName':['Joseph','Mary','Abram','Peter','John','Daniel','Cat'],
'LastName':['JosephL','MaryL','AbramL','PeterL','JohnL','DanielL','CatL'],
'CAR':['BMW','MB','Opel','Fiat','VW','','Ford'],
'Salary':[1250,3254,2599,4566,7855,9999,7500]
})

# 保留原分组计数逻辑
g = df.groupby(['ID']).cumcount().add(1) 
df_pivot = df.set_index(['ID',g]).unstack(fill_value=0)
# 按原规则重命名列
df_pivot.columns = ["{}{}".format(a,b) for a,b in df_pivot.columns]
df_pivot = df_pivot.reset_index()

# 关键:生成目标列顺序
# 1. 定义原数据集的字段顺序(排除ID)
field_order = ['FirstName', 'LastName', 'Salary', 'CAR']
# 2. 获取最大的计数编号(即单个ID对应最多记录数)
max_count = g.max()
# 3. 按计数+字段顺序循环生成列名
target_columns = ['ID']
for i in range(1, max_count+1):
    target_columns.extend([f"{field}{i}" for field in field_order])

# 重新排列列
df_pivot = df_pivot[target_columns]
print(df_pivot)

原代码乱序原因

原代码中的sort_index(axis=1,level=1)是按**列的第二层索引(计数编号)**排序,会把同名字段的列集中排列(比如所有FirstName开头的列先出现,再是LastName系列),完全偏离了循环排列的需求。

核心逻辑说明

  • 提取原数据集的字段顺序field_order,确保循环基础和源数据一致
  • 确定最大计数编号,明确需要循环的次数
  • 按「计数编号+字段顺序」拼接列名,生成目标序列后重新索引DataFrame,即可得到期望的列顺序

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:55:20