2016-11-10 95 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