在pandas数据帧中转置列,同时保持其他列完整且重复

时间:2018-01-19 09:58:26

标签: python pandas csv dataframe transpose

我的数据框如下

selection_id  last_traded_price
430494        1.46
430494        1.48
430494        1.56
430494        1.57
430495        2.45
430495        2.67
430495        2.72
430495        2.87

我有很多行包含选择ID,我需要保持selection_id列相同,但是将最后交易价格中的数据转换为这样。

selection_id  last_traded_price
430494        1.46              1.48          1.56      1.57    e.t.c 
430495        2.45              2.67          2.72      2.87    e.t.c

我尝试过使用数据透视

   (df.pivot(index='selection_id', columns=last_traded_price', values='last_traded_price')

由于selection_id中的重复行,Pivot无法正常工作。 是否可以先转置数据并删除重复数据?

2 个答案:

答案 0 :(得分:2)

选项1
groupby + apply

v = df.groupby('selection_id').last_traded_price.apply(list)
pd.DataFrame(v.tolist(), index=v.index)

                 0     1     2     3
selection_id                        
430494        1.46  1.48  1.56  1.57
430495        2.45  2.67  2.72  2.87

选项2
可以使用pivot执行此操作,只要您有另一列计数通过以进行透视(它需要沿某物旋转,即&# 39;为什么)。

df['Count'] = df.groupby('selection_id').cumcount()
df.pivot('selection_id', 'Count', 'last_traded_price')

Count            0     1     2     3
selection_id                        
430494        1.46  1.48  1.56  1.57
430495        2.45  2.67  2.72  2.87

答案 1 :(得分:1)

cumcount + set_indexunstack创建的新列名称,您可以使用pandas.pivot作为计数器:

g = df.groupby('selection_id').cumcount()
df = df.set_index(['selection_id',g])['last_traded_price'].unstack()
print (df)
                 0     1     2     3
selection_id                        
430494        1.46  1.48  1.56  1.57
430495        2.45  2.67  2.72  2.87

pivot类似的解决方案:

df = pd.pivot(index=df['selection_id'], 
              columns=df.groupby('selection_id').cumcount(), 
              values=df['last_traded_price'])
print (df)
                 0     1     2     3
selection_id                        
430494        1.46  1.48  1.56  1.57
430495        2.45  2.67  2.72  2.87