2017-10-25 14 views
0

データフレーム内の複数の列を、別のdf(両方のdfsに 'KEY'列があります)に乗算係数を使用して更新します。これを達成することはできましたが、数百万のレコードがあるので、処理時間がかかります。もしあれば、より最適なソリューションを探してください。Pandas:別のデータフレームのインデックスに基づいて列を更新する

ダミーdfsを使用して私のシナリオを説明しましょう。私は今、私はKEYに基づいて、以下のdf2データフレームからフェッチ要因によってcol2col3を変更したい

In [8]: df1 
Out[8]: 
    KEY col2 col3 col4 
0 1  1 10  5 
1 2  7 13  8 
2 1 12 15 12 
3 4  3 23  1 
4 3 14  5  6 

以下のようにデータフレームDF1を持っています。

In [11]: df2 
Out[11]: 
    FACTOR 
KEY   
1  100 
2  3000 
3  1000 
4  200 
5  50 

私は必要なものを達成するために以下のループを使用しています。

In [12]: for index, row in df2.iterrows(): 
      df1.loc[(df1['KEY']==index), ['col2', 'col3']] *= df2.loc[index]['FACTOR'] 

In [13]: df1 
Out[13]: 
    KEY col2 col3 col4 
0 1 100 1000  5 
1 2 21000 39000  8 
2 1 1200 1500 12 
3 4 600 4600  1 
4 3 14000 5000  6 

これは機能します。しかし、私の実際のデータには数百万のレコードがリアルタイムで入っており、入ってくるデータの各バッチを完了するまでに約15秒かかります。

c=df1.merge(df2,on="KEY") 

Cのデータフレームは、今ある「FACTOR」の列が含まれます:forループマージを使用する必要があります

答えて

0

O(n)複雑でそれをやっているように見えるので、私はよりよい解決策を探していますあなたがインデックスされ、あなたが使用できるフィールドの一つが合併する場合

を達成したい結果:

c=df1.merge(df2,left_on="KEY",right_index=True) 
+0

感謝。しかし、私が望んでいたのは、単に "Factor"をマージするのではなく、キーに基づいてdf1の列を掛けることでした。しかし、これは私が2つのステップで私が欲しいものを達成できるという考えを私に与えました。最初にマージして、2つの列に 'multiply'関数を使って最終出力を取得します。 – MattO

+0

そして私は自分の問題に対処するための良いアイデアを+1しましたが、今は私が望む1つのラインとは違って2つのステップが必要です。ありがとう@WNG – MattO

関連する問題