2014-05-13 61 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]