python – 索引pandas DataFrame

我有一个具有以下结构的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

最后一步,可能会有一种更优雅的方式,但我对熊猫来说相对较新,这是我现在能想到的最好的方法.

相关文章

我最近重新拾起了计算机视觉,借助Python的opencv还有face_r...
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Poolin...
记得大一学Python的时候,有一个题目是判断一个数是否是复数...
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic ...
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic v...
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic ...