【发布时间】:2016-11-26 13:38:58
【问题描述】:
我想在名为result 的现有DataFrame 中创建一个名为str_bos 的列。我有以下列-'str_nbr', 'ZIP Sales', 'str_Sales', 'ZIP_Distinct #', 'ZIP_Share_of_Str_Sales', 'Counter', 'Str_BOS_Cum%', 'Str_Sales_Rank'。
这是我想出的。但是,需要2个小时才能完成。但是,其他操作(如排序、合并等)需要几秒钟。我在这里缺少什么?
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方法遍历每一行,而矢量化方法一次对整个列进行计算。在 pandas 中,您需要避免迭代行——几乎可以保证它的性能很差。这个博客有很好的解释(迭代、应用和向量化部分):tomaugspurger.github.io/modern-4-performance.html
标签: python function pandas calculated-columns