2016-08-09 11 views
1

我有具有以下結構的GROUPBY /出棧上的列命名

idx value Formula_name 
0 123456789  100  Frequency No4 
1 123456789  150  Frequency No25 
2 123456789  125  Frequency No27 
3 123456789  0.2  Power Level No4 
4 123456789  0.5  Power Level No25 
5 123456789  -1.0 Power Level No27 
6 123456789  32  SNR No4 
7 123456789  35  SNR No25 
8 123456789  37  SNR No27 
9 111222333  ... 

因此,唯一的辦法一個數據幀,以涉及的頻率其相應的度量是經由頻率的數量。我知道可能的範圍(從100到200 MHz,以25 MHz爲單位),但不知道數據中顯示了哪些頻率(或多少),也沒有使用哪個「數字」將頻率與度量關聯起來。

我想,在類似的數據幀到達:

    SNR      Power Level 
    idx   100 125 150 175 200 100 125 150 175 200 
0 123456789  32 37 35 NaN NaN 0.2 -1.0 0.5 NaN NaN 
1 111222333  ... 

只有一個指標,我創建了兩個dataframes,一個與頻率,一個與指標,併合並他們在人數:

 idx   Formula_x value_x number Formula_y value_y 
0 123456789 SNR  32  4  frequency 100 
1 123456789 SNR  35  25  frequency 150 

然後我會拆散數據框:

df.groupby(['idx','value_y']).first()[['value_x']].unstack() 

這適用於一個滿足ric,但我真的不知道如何將其應用於更多指標並通過列中的多指標訪問它們。

任何意見和建議將是非常受歡迎的。

回答

2

您可以使用:

print (df) 
     idx value  Formula_name 
0 123456789 100.0  Frequency No4 
1 123456789 150.0 Frequency No25 
2 123456789 125.0 Frequency No27 
3 123456789 0.2 Power Level No4 
4 123456789 0.5 Power Level No25 
5 123456789 -1.0 Power Level No27 
6 123456789 32.0   SNR No4 
7 123456789 35.0   SNR No25 
8 123456789 37.0   SNR No27 

#create new columns from Formula_name 
df[['a','b']] = df.Formula_name.str.rsplit(n=1, expand=True) 

#maping by Series column b - from No4, No25 to numbers 100,150... 
maps = df[df.a == 'Frequency'].set_index('b')['value'].astype(int) 
df['b'] = df.b.map(maps) 

#remove rows where is Frequency, remove column Formula_name 
df1 = df[df.a != 'Frequency'].drop('Formula_name', axis=1) 
print (df1) 
     idx value   a b 
3 123456789 0.2 Power Level 100 
4 123456789 0.5 Power Level 150 
5 123456789 -1.0 Power Level 125 
6 123456789 32.0   SNR 100 
7 123456789 35.0   SNR 150 
8 123456789 37.0   SNR 125 

兩種解決方案 - 與unstackpivot_table

df2 = df1.set_index(['idx','a', 'b']).unstack([1,2]) 
df2.columns = df2.columns.droplevel(0) 
df2 = df2.rename_axis(None).rename_axis([None, None], axis=1) 
print (df2) 
      Power Level    SNR    
        100 150 125 100 150 125 
123456789   0.2 0.5 -1.0 32.0 35.0 37.0 

df3 = df1.pivot_table(index='idx', columns=['a','b'], values='value') 
df3 = df3.rename_axis(None).rename_axis([None, None], axis=1) 
print (df3) 
      Power Level    SNR    
        100 125 150 100 125 150 
123456789   0.2 -1.0 0.5 32.0 37.0 35.0 
+0

謝謝。這個伎倆。雖然我用'merge'代替'map',但由於使用了多個idx,地圖顯得格格不入。 – WilliamEllisWebb

+0

是的,這是另一種選擇,謝謝你接受,祝你好運(+1問題,我昨天忘記) – jezrael