2017-01-10 11 views
2

私は2つのパンダのデータフレームdfAとdfBを持っています。 dfAには、未知数、たとえばx個の列があります。 dfBはx - 1個の値を持つ数値配列です。したがって、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機能のいずれかを使用してこれを実行しようとしてきたが、解決策を見つけるために管理していません。 subによってdfAからarray dfB

答えて

2

使用numpyの - 基本的

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

、我々はdfBを引きますdfAの各行から、私たちはNumPy配列を使って作業しているので(私たちはそれらをwi th .values)、これはbroadcasted mannerで効率的に減算されます。次に、絶対値を見つけ、.argmin(axis=0)、つまり.argmin(0)で各列に沿ってarg-minimumを探します。

NaNsで作業している場合は、これらを無視するとnp.nanargminを使用してください。この、jezraelため

# 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知っているとpandasはこれらの減算に 'broadcast'を使いますか? – Divakar

2

Substract値は、absによって絶対値を取得し、最後idxminで極小値のindexを見つける:

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

感謝を - 理解するために物事を容易にするために、ステップのサンプルの実行によって

ステップ。出力はすべてNaNです。 dfAまたはdfBにはNaNはありません。 – BioProg

関連する問題