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

