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