2013-04-15 27 views
3

我有一個DataFrame,其中有幾個列中的標識符組件和一個與另一列中的標識符關聯的值。我希望能夠創建n列,以便每列都是標識參數。生成新列作爲其他列的組合

  foo Type  ID  Index Value 
25090  x  A  0  0  23272000 
25090  x  A  0  0  23272000 
25091  x  A  1  0  22896000 
25092  x  B  0  1  20048000 
25093  y  A  0  0  19760000 
25092  y  B  0  1  20823342 

我想讓它使得存在的Type_ID_Index集團(我可以根據groupby得到)N列和每一列都有各自的價值。我想把這個值與foo關聯起來。

  foo   A_0_0  A_1_0  B_0_1  
25090  x   23272000 22896000 20048000 
25090  x   23272000 22896000 20048000 
25091  x   23272000 22896000 20048000 
25092  x   23272000 22896000 20048000 
25093  y   19760000 21568000 20823342 
25092  y   19760000 21568000 20823342 

如何做到這一點?

回答

3

通過應用join逐行與示例數據

In [3]: df 
Out[3]: 
     foo bar Type ID Index  Value 

25090 x 9 A 0  0 23272000 
25090 x 5 A 0  0 23272000 
25091 x 3 A 1  0 22896000 
25092 x 3 B 0  1 20048000 
25093 y 6 A 0  0 19760000 
25092 y 4 B 0  1 20823342 

串連每行的IDENTIFER開始。

In [4]: identifier = df[['Type', 'ID', 'Index']].apply(
      lambda x: '_'.join(map(str, x)), axis=1) 

從您的Value列創建一個Series,並將其用identifer和foo索引。

In [5]: v = df['Value'] 

In [6]: v.index = pd.MultiIndex.from_arrays([df['foo'], identifier]) 

In [7]: v 
Out[7]: 
foo  
x A_0_0 23272000 
    A_0_0 23272000 
    A_1_0 22896000 
    B_0_1 20048000 
y A_0_0 19760000 
    B_0_1 20823342 
Name: Value, dtype: int64 

拆開它,並將它加入'foo'上的原始DataFrame。

In [8]: df[['foo', 'bar']].join(v.drop_duplicates().unstack(), on='foo') 
Out[8]: 
     foo bar  A_0_0  A_1_0  B_0_1 

25090 x 9 23272000 22896000 20048000 
25090 x 5 23272000 22896000 20048000 
25091 x 3 23272000 22896000 20048000 
25092 x 3 23272000 22896000 20048000 
25093 y 6 19760000  NaN 20823342 
25092 y 4 19760000  NaN 20823342 

請注意,我之前開拆它放棄了重複的v。這是至關重要的。如果數據集中任何位置的同一個idenitifer具有不同的值,則會遇到麻煩。

小問題:您的示例輸出有一行(25094),您的示例輸入中缺少一行。另外,我的輸出中的NaN是有意義的:當foo ='y'時,沒有值由A_1_0指定。

+0

_如果數據集中任何位置的同一個idenitifer具有不同的值,您將遇到麻煩。我的測量結果可能會很嘈雜,所以這將是一個問題。什麼是一個優雅的方法來平均他們? –

+1

我想我得到了這個。這是我做的: v = v.groupby(v.index).mean() v.index = pd.MultiIndex.from_tuples(v.index) –

相關問題