2014-05-13 133 views
3

說我有一個多索引數據框df與一列A。我希望創建一個新的列B,其中我將m(例如0)和M(例如1)的值分配給列A的每個組內的最低值和最高值,同時線性內插所有值之間的值。組內的線性插值

作爲示例,請考慮以下df。我願做插值爲每X

     A 
X  Y        
bar one -0.007381 
     two -1.219794 
baz one  0.145578 
     two -0.249321 
     three -0.249321 
     four 0.21  
foo one -1.046479 
     two  1.314373 
qux one  0.716789 
     two  0.385795 

我相信我可以在熊貓aggregatetransform組合做到這一點,但我不知道怎麼樣。

+1

你如何確定排序?根據'Y'中的序數詞,在'Y'上按字母順序排列,還是按'A'中的值排序?一旦你回答了這個問題:你是否想要簡單的分位數(例如,對於有三個成員的組,0.0,0.5,1.0)或將'Y'的值仿射重新縮放爲[m,M]? –

+0

謝謝@RamanShah用分位數來做它會很棒**。我不確定我瞭解您的訂購問題。在每個「X」組中,有幾行('A'條目)。我想要的是根據它們屬於它們的「X」級別的分位數,在每行中爲'm-M'範圍內的新列'B'分配一個數字。這個數字應該線性插值。例如。底部'10%'獲得'm',接下來'10%'獲得'10%(Mm)+ m'等 –

+0

[transform docs]中的第一個例子(http://pandas.pydata.org/pandas -docs/stable/groupby.html#transformation)與您想要的非常接近。 –

回答

2

它認爲它可能是更好的,如果你使用groupby而不是mutliIndex: 數據:

X  Y A       
bar one -0.007381 
bar two -1.219794 
baz one  0.145578 
baz two -0.249321 
baz three -0.249321 
baz four 0.21  
foo one -1.046479 
foo two  1.314373 
qux one  0.716789 
qux two  0.385795 

和:

In [47]: 

df['new']=df.groupby(df.X).transform(lambda x: (x - x.min())/x.ptp()).A 
print df 
    X  Y   A  new 
0 bar one -0.007381 1.000000 
1 bar two -1.219794 0.000000 
2 baz one 0.145578 0.859745 
3 baz two -0.249321 0.000000 
4 baz three -0.249321 0.000000 
5 baz four 0.210000 1.000000 
6 foo one -1.046479 0.000000 
7 foo two 1.314373 1.000000 
8 qux one 0.716789 1.000000 
9 qux two 0.385795 0.000000 

[10 rows x 4 columns]