2016-11-10 72 views
-1

我有以下几点:移调在python数据帧一列

Index ID  speed _avg_val 
245 1  10  30.5 
246 1  2  25.1 

我要转列ID,然后有以下几点:

ID (Index) speed _avg_val speed_y _avg_val_y 
1    10  30.5  2   25.1 

我试图用这种方法Transposing one column in python pandas with the simplest index possible但能没有得到这与多列工作。

+0

目前还不清楚你在问什么。如果你有更多的行会发生什么? – IanS

+0

带'245'和'246'值的'索引'是不必要的? – jezrael

+1

我想分组重复的ID,然后将其变量转换为单行。所以如果你有更多的行,它只需要在右边添加更多的列。 目前我有1000多列,所以在这种情况下,我的df.shape如下:(1118,18)。一旦转换,它应该有一个df.shape(〜700,〜200)。 – germanfox

回答

2

我觉得你可以先删除列Index,然后加列IDindexunstack和列由sort_index多指标的排序第二级:

print (df) 
    Index ID speed _avg_val 
0 245 1  10  30.5 
1 246 1  2  25.1 


df = df.drop('Index', axis=1) 
     .set_index('ID', append=True) 
     .unstack(0) 
     .sort_index(axis=1, level=1) 

#remove MultiIndex from columns 
df.columns = ['_'.join((col[0], str(col[1]))) for col in df.columns] 

print (df) 
    speed_0 _avg_val_0 speed_1 _avg_val_1 
ID           
1  10  30.5  2  25.1 

如果在ID列多个值,需要使用cumcount

print (df) 
    Index ID speed _avg_val 
0 245 1  10  30.5 
1 246 1  2  25.1 
2 245 2  5  37.5 
3 246 2  28  28.1 
4 246 2  27  23.0 

df = df.drop('Index', axis=1) 
df['g'] = df.groupby('ID').cumcount() 
df = df.set_index(['ID', 'g']).unstack(fill_value=0).sort_index(axis=1, level=1) 
df.columns = ['_'.join((col[0], str(col[1]))) for col in df.columns] 

print (df) 
    speed_0 _avg_val_0 speed_1 _avg_val_1 speed_2 _avg_val_2 
ID                
1  10  30.5  2  25.1  0   0.0 
2   5  37.5  28  28.1  27  23.0 
+0

这与我正在寻找的非常接近! 如何保持订单以便输出为 speed_0 _avg_val_0 speed_1 _avg_val_1? – germanfox

+0

是的,请参阅编辑。 – jezrael

+0

使用包含多个值的ID可以使其最有效的方式是什么? – germanfox