我有两个pandas数据帧,dfA和dfB。
dfA有一个未知的列数,比如x。dfB是一个数值为x–1的numpy数组。因此,如果dfA有50列(0到49),那么dfB将有49个值。这49个值与dfA列1-49关联。
在dfA的第0列中,我需要从最接近后续列中dfB中相应值的行中输出值。我知道那句话毫无意义。下面是一个例子:

dfA:
0   0.02    0.06    0.09    0.10
1   0.92    0.82    0.71    0.61
2   0.92    0.82    0.72    0.62
3   0.94    0.84    0.74    0.64
4   0.96    0.86    0.76    0.66
5   0.98    0.88    0.78    0.68


dfB:
    0.94    0.862   0.732   0.623


Answer: 3   4   3   2

我一直在尝试使用pandas查询函数或loc/iloc特性来实现这一点,但一直没有找到解决方案。

最佳答案

使用NumPy-

a = df.values
out = a[np.abs(a[:,1:] - dfB.values.ravel()).argmin(0),0]

基本上,我们从dfB的每一行中减去dfA,因为我们使用的是NumPy数组(正如我们从.values中提取的那样),所以在broadcasted manner中可以有效地减去这些。然后,我们找到绝对值,并沿着.argmin(axis=0)的每一列查找arg最小值,简而言之.argmin(0)
如果您也在使用NaNs,请使用np.nanargmin忽略它们。
一步一步的样本运行,使事情更容易理解-
# Extract array from dfA
In [9]: a = dfA.values

# Slice a from col-1 onwards and perform broadcasted differencing with dfB values
In [10]: a[:,1:] - dfB.values.ravel()
Out[10]:
array([[-0.92 , -0.802, -0.642, -0.523],
       [-0.02 , -0.042, -0.022, -0.013],
       [-0.02 , -0.042, -0.012, -0.003],
       [ 0.   , -0.022,  0.008,  0.017],
       [ 0.02 , -0.002,  0.028,  0.037],
       [ 0.04 ,  0.018,  0.048,  0.057]])

# Get absolute values
In [11]: np.abs(a[:,1:] - dfB.values.ravel())
Out[11]:
array([[ 0.92 ,  0.802,  0.642,  0.523],
       [ 0.02 ,  0.042,  0.022,  0.013],
       [ 0.02 ,  0.042,  0.012,  0.003],
       [ 0.   ,  0.022,  0.008,  0.017],
       [ 0.02 ,  0.002,  0.028,  0.037],
       [ 0.04 ,  0.018,  0.048,  0.057]])

# Look for argmin along each col
In [14]: idx = np.abs(a[:,1:] - dfB.values.ravel()).argmin(axis=0)

In [17]: idx
Out[17]: array([3, 4, 3, 2])

# First col from a
In [15]: a[:,0]
Out[15]: array([ 0.,  1.,  2.,  3.,  4.,  5.])

# Index into first col with those indices to select the desired output values
In [16]: a[idx,0]
Out[16]: array([ 3.,  4.,  3.,  2.])

关于python - python(Pandas)根据不同列满足的条件从列0输出的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41577873/

10-12 18:44