我有一堆数据帧和相同数量的数组,表示这些数据框中price
列的间隔(中断数字)
我需要根据这些时间间隔分配名为description_contrib
的新列,例如如果价格为16美元且区间数组看起来像[0,10]
,则表示此行的description_contrib
列将为2,因为16大于0且大于10
我想出了这段代码:
def description_contribution(df_cat):
for i in range(0, len(df_cat)):
for j in range(0, len(intervals[i])):
df_cat[i]['description_contrib'].loc[df_cat[i]['price'] >= intervals[i][j]] = j
但它运行缓慢,可能有更强大的解决方案
我如何改善这一点?
UPD 数据看起来像这样
train_id item_condition_id brand_name price shipping description_contrib
5644 1 Unknown 15.0 1 6
12506 1 Unknown 8.0 1 3
26141 1 Unknown 20.0 1 8
此数据框的间隔为:
[0.0, 0.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 20.0, 22.0, 31.0]
答案 0 :(得分:1)
大多数情况下,加快速度的第一个选择是用向量化操作替换循环。例如,您可以通过以下方式使代码更快,更易读:
import pandas as pd
intervals = [0, 10]
df_cat = pd.DataFrame({'price': range(100)})
df_cat['description_contrib'] = sum(df_cat['price'] > v for v in intervals)
假设df_cat有很多行并且间隔很少,这将为您提供良好的性能。但是,可能存在更快的方式。
答案 1 :(得分:1)
您可以使用numpy数组进行广播比较 -
v = (df.price.values[:, None] > intervals).sum(1)
可以将其分配回df
-
df['description_contrib'] = v
需要注意的是内存使用情况,特别是对于较大的数据。速度的公平权衡。