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

如何按ID将Pandas DataFrame的列转换为行?

解决方案

你的需求核心是将每个id对应的name值按分组顺序转为列,不足的位置补空字符串。注意你的期望输出存在两处可能的笔误:原数据中id=1的name是["apple", "potato","lemon"],但你期望输出里写的是三个apple;另外原数据包含id=5,但期望输出里出现了原数据没有的id=3。下面先按正确逻辑实现,再说明如何调整到你期望的格式。

实现步骤

  1. 给每个id分组内的行添加序号,用于转置时确定行位置
  2. 用透视表将id转为列,分组序号转为行索引
  3. 填充缺失值为空字符串
  4. (可选)添加原数据中不存在的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:32:27