2017-12-21 2 views
7

걸쳐 사전 값을 사용하여 곱팬더 다음 dataframe 주어 여러 열

a b c d output 
0 1 5 3 3 24.1 
1 2 4 2 2 21.4 
2 3 3 4 1 22.6 
3 4 3 3 1 23.8 
4 5 4 10 1 38.4 

:

params = {'a': 2.5, 'b': 3.0, 'c': 1.3, 'd': 0.9} 

다음 원하는 출력을 연출 나는이 결과를 내기 위해 이것을 사용했다 :

df['output'] = [np.sum(params[col] * df.loc[idx, col] for col in df) 
       for idx in df.index] 

그러나 이것은 매우 느린 접근 방법이며 내장형 팬더 기능을 사용하는 더 좋은 방법이 있어야한다고 생각합니다.

# Line up the parameters 
col_sort_key = list(df) 
params_sorted = sorted(params.items(), key=lambda k: col_sort_key.index(k[0])) 

# Repeat the parameters *n* number of times 
values = [v for k, v in params_sorted] 
values = np.array([values] * df.shape[0]) 

values 
array([[ 2.5, 3. , 1.3, 0.9], 
     [ 2.5, 3. , 1.3, 0.9], 
     [ 2.5, 3. , 1.3, 0.9], 
     [ 2.5, 3. , 1.3, 0.9], 
     [ 2.5, 3. , 1.3, 0.9]]) 

# Multiply and add 
product = df[col_sort_key].values * values 
product 
array([[ 2.5, 15. , 3.9, 2.7], 
     [ 5. , 12. , 2.6, 1.8], 
     [ 7.5, 9. , 5.2, 0.9], 
     [ 10. , 9. , 3.9, 0.9], 
     [ 12.5, 12. , 13. , 0.9]]) 

np.sum(product, axis=1) 
array([ 24.1, 21.4, 22.6, 23.8, 38.4]) 

을하지만 그 조금 뒤얽힌 보인다

는 나는이 생각! 네이티브 팬더에 대한 생각은 없습니까?

+0

포인트를 dot을 사용할 수 있습니다 자신의 었죠 빠른 내 실제 사용 사례. 나의 오래된 접근법은이 새로운 것보다 65 배 느렸다. 고마워, 모두들. – blacksite

+0

numpy에서 행렬 벡터 곱셈은 어떻게됩니까? 이렇게하면 결국 np.matmul (df.as_matrix(), np.array (2.5, 3.0, 1.3, 0.9))와 같은 결과가 나타납니다. –

답변

3

당신은 assign + mul + sum 사용할 수 있습니다

df1 = df.assign(**params).mul(df).sum(1) 
print (df1) 
0 24.1 
1 21.4 
2 22.6 
3 23.8 
4 38.4 
dtype: float64 

그리고 dot + Series 생성자 :

df1 = df.dot(pd.Series(params)) 
print (df1) 
0 24.1 
1 21.4 
2 22.6 
3 23.8 
4 38.4 
dtype: float64 
5
(pd.Series(params)*df).sum(1) 
Out[816]: 
0 24.1 
1 21.4 
2 22.6 
3 23.8 
4 38.4 
dtype: float64 

상세 정보 :

pd.Series(params) 
Out[817]: 
a 2.5 
b 3.0 
c 1.3 
d 0.9 
dtype: float64 

(pd.Series(params)*df) 
Out[818]: 
     a  b  c d 
0 2.5 15.0 3.9 2.7 
1 5.0 12.0 2.6 1.8 
2 7.5 9.0 5.2 0.9 
3 10.0 9.0 3.9 0.9 
4 12.5 12.0 13.0 0.9 
,691,363 귀하의 예를 들어210

, 당신이 있기 때문에뿐만 아니라 Jezrael에

df.values.dot(np.array(list(params.values()))) 
Out[827]: array([ 24.1, 21.4, 22.6, 23.8, 38.4])