32662


Pandasで以下のコードような計算をすると、1時間程度かかってしまいます。  
df1を使ってdf2の各項目のデータを計算しています。  
一般にfor文を使うと時間がとてもかかると聞きましたが、では以下のコードをどう改善すれば実行時間をみじかくできるでしょうか？

df1の行数が50万であり、以下のコードではfor文で1行ずつ参照しています。

[code]

    df1 = pd.DataFrame(***)
    df2 = pd.DataFrame(***)
    for i in range(500000):
      df2.ix[df2['CustomerID'][i],df2['ProductID'][i]] += df2['Quantity'][i]
    
[/code]

  
  
  

\-------追記(2/12 19:38)-------

コメントでご指摘くださった通り、コードを書き間違えていました。  
4行目は正しくは以下の通りです。

[code]

      df2.ix[df1['CustomerID'][i],df1['ProductID'][i]] += df1['Quantity'][i]
    
[/code]


CC BY-SA 3.0
2017-02-12T07:15:36.177
32601
2017-02-14T07:40:12.267
2017-02-12T10:40:40.983
9610
9610
question
python pandas
Pandasを使った計算の実行時間短縮のためにはどうすればいいでしょうか？


実現したいことは`df1`のデータの`CustomerID`と`ProductID`を`Quantity`で重みづけしてクロス集計したいということですね。pandasには`crosstab`というクロス集計用関数がありこの場合以下のように使います

[code]

    import numpy
    df2 = pd.crosstab(df1.CustomerID, df1.ProductID, values=df1.Quantity, aggfunc=numpy.sum)
    
[/code]

引数としては`df1.CustomerID`を`df1.ProductID`をクロス集計の対象にする。集計する値は`df1.Quantity`を使いどのように足し上げるかを指定する引数`aggfunc`には単純に和をとる関数を指定するというふうにしています。  
どのくらい速度がでるかはデータにもよりますが、ランダムに作ったデータで手元で実験してみると100000行で42sec->0.13secのように高速化しました。なおdf2にもと値が入っていてそれにさらに足し上げたい場合は`df2
+= pd.crosstab(df1.CustomerID, df1.ProductID, values=df1.Quantity,
aggfunc=numpy.sum)`とすればよいと思います。


CC BY-SA 3.0
2017-02-14T07:40:12.267
32662
2017-02-14T07:40:12.267
14418
32601
answer