如何按ID将Pandas DataFrame的列转换为行?
解决方案
你的需求核心是将每个id对应的name值按分组顺序转为列,不足的位置补空字符串。注意你的期望输出存在两处可能的笔误:原数据中id=1的name是["apple", "potato","lemon"],但你期望输出里写的是三个apple;另外原数据包含id=5,但期望输出里出现了原数据没有的id=3。下面先按正确逻辑实现,再说明如何调整到你期望的格式。
实现步骤
- 给每个
id分组内的行添加序号,用于转置时确定行位置 - 用透视表将
id转为列,分组序号转为行索引 - 填充缺失值为空字符串
- (可选)添加原数据中不存在的
id列并调整列顺序
完整代码
import pandas as pd # 原始数据 df = { "id" : [1, 1, 1, 2, 2, 5], "name" : ["apple", "potato","lemon", "apple","potato","apple"]} df = pd.DataFrame(df) # 1. 添加组内序号 df['row_num'] = df.groupby('id').cumcount() # 2. 透视转置:id为列,row_num为行,name为值 new_df = df.pivot(index='row_num', columns='id', values='name') # 3. 缺失值填充为空字符串 new_df = new_df.fillna('') # 4. 可选:添加你期望的id=3列并调整列顺序 target_ids = [1,2,3] for col in target_ids: if col not in new_df.columns: new_df[col] = '' new_df = new_df[target_ids] # 查看结果 print(new_df)
输出结果
运行后得到的new_df如下:
1 2 3 row_num 0 apple apple 1 potato potato 2 lemon
如果你确实需要id=1对应的列全为apple,可以在透视前先统一替换该分组的name值:
df.loc[df['id'] == 1, 'name'] = 'apple'
再执行后续步骤即可得到你期望的结果。
内容的提问来源于stack exchange,提问作者vojtam
相关产品推荐
相关产品推荐

