5

DataFrame次の構造のマルチインデックスがあります。

       0     1     2     ref
A  B             
21 45  0.01  0.56  0.23  0.02
22 45  0.30  0.88  0.53  0.87
23 46  0.45  0.23  0.90  0.23

私がやりたいことは次
のとおりです: 列 [0:2] から、列 'ref' に最も近い値を選択するため、期待される結果は次のようになります。

       closest
A  B             
21 45  0.01
22 45  0.88
23 46  0.23 
4

1 に答える 1

4

あなたの再構築DataFrame

In [1]: index = MultiIndex.from_tuples(zip([21,22,23],[45,45,46]), names=['A', 'B'])
In [2]: df = DataFrame({0:[0.01, 0.30, 0.45], 
                        1:[0.56, 0.88, 0.23], 
                        2:[0.23, 0.53, 0.90], 
                        'ref': [0.02, 0.87, 0.23]}, index=index)
In [3]: df
Out[3]: 
        0     1     2   ref
A  B                         
21 45  0.01  0.56  0.23  0.02
22 45  0.30  0.88  0.53  0.87
23 46  0.45  0.23  0.90  0.23

0最初に列の絶対距離を取得し、12からref:

 In [4]: dist = df[[0,1,2]].sub(df['ref'], axis=0).apply(np.abs)
 In [5]: dist
 Out[5]: 
         0     1     2
 A  B                   
 21 45  0.01  0.54  0.21
 22 45  0.57  0.01  0.34
 23 46  0.22  0.00  0.67

これdistで、次を使用して、行ごとに最小値を持つ列を決定できますDataFrame.idxmin

In [5]: idx = dist.idxmin(axis=1)
In [5]: idx
Out[5]: 
A   B 
21  45    0
22  45    1
23  46    1

new を生成するには、 indexclosestを使用するだけです。idxdf

In [6]: df['closest'] = idx.index.map(lambda x: df.ix[x][idx.ix[x]])
In [7]: df
Out[7]: 
        0     1     2   ref  closest
A  B                                  
21 45  0.01  0.56  0.23  0.02     0.01
22 45  0.30  0.88  0.53  0.87     0.88
23 46  0.45  0.23  0.90  0.23     0.23

最後のステップについては、もっとエレガントな方法があるかもしれませんが、私はパンダに比較的慣れていないので、それが今考えられる最善の方法です。

于 2012-06-14T18:39:53.053 に答える