我有一个具有以下结构的Multindex 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
最佳答案
重建您的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
我首先从ref获得columns0,1和2的绝对距离:
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
要现在生成新的最接近的,那么您只需要使用idx来索引df:
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
最后一步,可能会有一种更优雅的方式,但我对熊猫来说相对较新,这是我现在能想到的最好的方法.