2017-12-21 138 views
7

genelinde sözlük değerlerini kullanarak çarpınpandalar aşağıdaki dataframe Verilen birkaç sütun

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} 

aşağıdaki istenen çıktıyı üretin Bu sonucu üretmek için kullanıyorum:

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

Ancak, bu çok yavaş bir yaklaşım ve ben yerleşik pandalar işlevselliğini kullanarak daha iyi bir yolu olması gerektiğini düşünüyorum.

# 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]) 

Ama bu biraz dolambaçlı görünüyor:

Ben de bu düşünce! Yerel pandalar hakkında herhangi bir düşünce deniyor?

+0

Noktalar dot kullanabilirsiniz onun varlık sona erdi hızlı benim asıl kullanım örneği için. Eski yaklaşımım bu yeni olandan 65 kat daha yavaştı. Herkese teşekkürler. – blacksite

+0

Nümerik olarak matris vektör çarpımı hakkında ne dersiniz? Bu, aşağıdaki gibi bir sonuçla sonuçlanır: np.matmul (df.as_matrix(), np.array (2.5, 3.0, 1.3, 0.9)) –

cevap

3

Sen assign + mul + sum kullanabilirsiniz:

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 

Ve dot + Series yapıcı:

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 

diğer bilgiler:

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 
senin Örneğin 210

, sen beri de Jezrael için

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