2016-11-26 7 views
1

str_bosという列を、DataFrameという既存のresultに作成したいとします。私は次の列を持っています:'str_nbr', 'ZIP Sales', 'str_Sales', 'ZIP_Distinct #', 'ZIP_Share_of_Str_Sales', 'Counter', 'Str_BOS_Cum%', 'Str_Sales_Rank'DataFrameに計算フィールドを追加する

これは私が思いついたものです。しかし、完了に2時間かかります。ただし、ソート、マージなどの操作には数秒かかります。ここで私は何が欠けているのですか?私はここにcut()メソッドを使用すると思い

def str_bos(row): 
    if row['str_sales_rank'] == 1 or row['str_bos_cum%'] <= 0.1: 
     return 1 
    elif row['str_bos_cum%'] <= 0.2: 
     return 2 
    elif row['str_bos_cum%'] <= 0.3: 
     return 3 
    elif row['str_bos_cum%'] <= 0.4: 
     return 4 
    elif row['str_bos_cum%'] <= 0.5: 
     return 5 
    elif row['str_bos_cum%'] <= 0.6: 
     return 6 
    elif row['str_bos_cum%'] <= 0.7: 
     return 7 
    elif row['str_bos_cum%'] <= 0.8: 
     return 8 
    elif row['str_bos_cum%'] <= 0.9: 
     return 9 
    else: 
     return 10 

result['str_bos'] = result.apply(lambda row: str_bos(row), axis=1) 
+1

あなたのコードが遅い理由であるすべての行を超える '.apply'方法の反復処理し、ベクトル化の方法は列全体に対して計算を行うのに対し、すぐに。パンダでは、行間を反復することを避けたいと思うでしょう。これは恐ろしいパフォーマンスがほとんど保証されています。このブログには良い説明があります(反復、適用、ベクトル化のセクション):https://tomaugspurger.github.io/modern-4-performance.html – DataSwede

答えて

1

は:

In [21]: df = pd.DataFrame(np.random.rand(10), columns=['A']) 

In [22]: df 
Out[22]: 
      A 
0 0.513425 
1 0.973631 
2 0.549615 
3 0.747600 
4 0.099415 
5 0.737613 
6 0.885567 
7 0.720187 
8 0.446683 
9 0.434688 

In [23]: df['str_bos'] = pd.cut(df.A, bins=np.arange(0, 1.1, 0.1), labels=np.arange(10)+1) 

In [24]: df 
Out[24]: 
      A str_bos 
0 0.513425  6 
1 0.973631  10 
2 0.549615  6 
3 0.747600  8 
4 0.099415  1 
5 0.737613  8 
6 0.885567  9 
7 0.720187  8 
8 0.446683  5 
9 0.434688  5 
関連する問題