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

