2017-12-21 96 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

अंक के बाद से उपयोग कर सकते हैं उसके जा रहा समाप्त हो गया मेरे वास्तविक उपयोग के मामले के लिए सबसे तेजी से। मेरा पुराना दृष्टिकोण इस नए से 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 

अपने उदाहरण के लिए, आप dot रूप में अच्छी तरह Jezrael को

df.values.dot(np.array(list(params.values()))) 
Out[827]: array([ 24.1, 21.4, 22.6, 23.8, 38.4]) 
संबंधित मुद्दे