2017-12-21 11 views
7

を辞書値を使用して、乗算パンダは、次のデータフレームを考えると、いくつかの列にわたって

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 
彼は私の実際のユースケースのために最速になってしまったので、ご例えば210

は、あなたがJezraelに同様dot

df.values.dot(np.array(list(params.values()))) 
Out[827]: array([ 24.1, 21.4, 22.6, 23.8, 38.4]) 
関連する問題