2017-01-10 61 views
2

我有兩個熊貓數據框,dfA和dfB。 dfA有一個未知數,例如x,列數。 dfB是具有x-1個值的numpy數組。所以,如果dfA有50列(0到49),那麼dfB將有49個值。這49個值與dfA欄1-49相關聯。python(Pandas)根據第0列的輸出值根據不同的列滿足條件

從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 

我一直在努力做到這一點使用或者大熊貓查詢功能或LOC/ILOC功能,但沒有設法找到一個解決方案。

回答

2

使用NumPy的 -

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

基本上,我們減去dfBdfA的每一行開始,由於我們正在使用NumPy數組(因爲我們已經提取了那些wi .values),這些在broadcasted manner中被有效地扣除。然後,我們找到絕對值並沿.argmin(axis=0)(簡而言之.argmin(0))沿着每列查找最小值arg。

如果您也在使用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.]) 
+0

嗯,也許主要是時間上的差異,因爲'NaN'處理......你怎麼看? – jezrael

+0

@jezrael我想它只是它的陣列更快的方式,我猜? Nan處理可以用'np.nanargmin()'來解決。 – Divakar

+0

@jezrael如果你碰巧知道這些減法,大熊貓是否使用'broadcast'? – Divakar

2

通過subarray dfBdfA。減去值,由abs得到絕對值和idxmin最後找到極小值index

print (dfA.sub(dfB, axis=1).abs().idxmin()) 
1 3 
2 4 
3 3 
4 2 
dtype: int64 
+0

感謝這個,jezrael。輸出全部是NaN。 dfA或dfB中沒有NaN。 – BioProg

相關問題