2017-01-10 1 views
2

두 개의 팬더 데이터 프레임 dfA와 dfB가 있습니다. dfA에는 알 수없는 x 열이 있습니다. dfB는 x - 1 개의 값을 갖는 수적으로 배열입니다. 따라서 dfA에 50 개의 열 (0 - 49)이있는 경우 dfB는 49 개의 값을가집니다. 이 49 개의 값은 dfA 열 1-49와 관련됩니다.python (팬더) 출력 값은 다른 열이 만나는 조건에 따라 0 열에서 산출됩니다.

dfA의 열 0에서 다음 열의 dfB에서 해당 값에 가장 가까운 행의 값을 출력해야합니다. 나는 문장이 의미가 없다는 것을 안다. 나는이 사용 팬더 쿼리 기능 또는 LOC/iloc 기능 중 하나를 수행하기 위해 노력했지만 해결책을 찾기 위해 관리하지 않은

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 

예를 들면 다음과 같습니다이다. 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) 인 각 열을 따라 arg-minimum을 찾으십시오. 축약어는 .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.]) 
+0

흠, 어쩌면 타이밍의 차이가 있을지도 모른다. NaN 처리 때문이다. 어떻게 생각하니? – jezrael

+0

@jezrael 나는 배열로 생각하면 그 방법이 빠를 것이라고 생각 하겠지요? Nan 처리는'np.nanargmin()'으로 해결할 수 있습니다. – Divakar

+0

@jezrael 팬더는 이러한 감산에 '방송'을 사용합니까? – Divakar

2

빼기 값, 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

관련 문제