-1

我在 python 中创建了这个函数,用于为产品数据集生成不同的价格组合。因此,如果产品的价格是 10 美元,那么不同的可能价格将是 [10,11,12,13,14,15]。例如:

df = pd.DataFrame({'Product_id': [1, 2], 'price_per_tire': [10, 110]})

我的功能:

def price_comb(df):
    K= [0,1,2,3,4,5]
    final_df = pd.DataFrame()
    c=0
    for j in K:
        c+=1
        print('K count=' + str(c))
        for index,i in df.iterrows():
            if (i['price_per_tire']<=100):
                i['price_per_tire'] = i['price_per_tire'] + 1*j
            elif ((i['price_per_tire']>100) & (i['price_per_tire']<200)):
                i['price_per_tire'] = i['price_per_tire'] + 2*j
            elif ((i['price_per_tire']>200) & (i['price_per_tire']<300)):
                i['price_per_tire'] = i['price_per_tire'] + 3*j
            elif i['price_per_tire']>=300:
                i['price_per_tire'] = i['price_per_tire'] + 5*j
            final_df = final_df.append(i)
    return final_df 

当我运行这个函数时,输出是

df = pd.DataFrame({'Product_id': [1,1,1,1,1,1, 2,2,2,2,2], 'price_per_tire': [10,11,12,13,14,15, 110,112,114,116,118,120]})

545k 行数据集如何花费大量时间(最多 2 天)。我试图找到更快执行此操作的方法。任何帮助将不胜感激

4

1 回答 1

0

请提供代码的工作版本,这里不清楚price_per_tire的来源。

这个算法是 O(N 2 ),所以需要做很多改进。

第一个建议是避免使用 numpy 或 pandas 进行循环,尝试使用矢量方法解决您的问题。这意味着可以使用掩码技术重构内部循环

for x in df.iterrows():
   if x[fld] < limit:
      x[fld] = f(x[fld])

可以重构:

mask = df[fld] < limit
df[fld] = f(df[fld])   # if f(unction) can work in vectorial
df[fld] = df[fld].map(f)  # Rolling version but slower

使用这种方法,您可以将代码加速到令人惊讶的快速版本

还有一点就是df.append不是一个好习惯,做内联修改会更有效率。您必须在主循环之前创建所有需要的列,以便分配所有需要的空间。

于 2021-03-24T08:30:42.347 回答