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

Pandas DataFrame中转置指定列并保留含重复值列的解决方案

解决Pandas中同一ID多行价格转置为单行的问题

嘿,我来帮你搞定这个需求!你遇到的问题其实是pivot函数的特性导致的——它要求index和columns的组合必须是唯一的,而你同一个selection_id对应多个last_traded_price,用价格作为列名的话,必然会出现重复的组合,所以才会失效。

不需要先转置再去重,我们可以用更直接的方法来实现你的需求,下面给你两种常用的解决方案:

方法1:将同一ID的价格合并为列表列

这种方式会把每个selection_id对应的所有价格打包成一个列表,适合后续需要批量处理价格的场景:

import pandas as pd

# 构造你的示例数据
data = {
    'selection_id': [430494, 430494, 430494, 430494, 430495, 430495, 430495, 430495],
    'last_traded_price': [1.46, 1.48, 1.56, 1.57, 2.45, 2.67, 2.72, 2.87]
}
df = pd.DataFrame(data)

# 分组并聚合价格为列表
result = df.groupby('selection_id')['last_traded_price'].agg(list).reset_index()
print(result)

执行后输出:

selection_id          last_traded_price
0        430494  [1.46, 1.48, 1.56, 1.57]
1        430495  [2.45, 2.67, 2.72, 2.87]

方法2:展开为独立的价格列

如果你希望每个价格都作为单独的列(比如last_traded_price_1、last_traded_price_2),可以先给每个分组内的价格添加序号,再用pivot:

# 给每个selection_id下的价格添加序号
df['price_seq'] = df.groupby('selection_id').cumcount() + 1  # 序号从1开始

# 执行pivot并重新命名列
result = df.pivot(
    index='selection_id',
    columns='price_seq',
    values='last_traded_price'
).reset_index()

# 重命名列名,让格式更清晰
result.columns = ['selection_id'] + [f'last_traded_price_{i}' for i in result.columns[1:]]
print(result)

执行后输出:

selection_id  last_traded_price_1  last_traded_price_2  last_traded_price_3  last_traded_price_4
0        430494                 1.46                 1.48                 1.56                 1.57
1        430495                 2.45                 2.67                 2.72                 2.87

为什么你之前的pivot写法失效?

你用的df.pivot(index='selection_id', columns='last_traded_price', values='last_traded_price')中,columns参数用了last_traded_price,这意味着每个selection_id+last_traded_price的组合必须唯一,但你的数据里同一个selection_id对应多个价格,就会出现重复的组合,pivot无法处理这种情况,所以报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:49:36