如何重构多次连接数据帧的函数?



我在python脚本中找到了瓶颈。此函数占用我的csv超过4分钟。

是更好地使用数据框架分配函数与lambda在这里?对于我写的函数,这是可能的吗?

这个函数检查一个条目是否在数据框中出现了不止一次,如果是真的,它应该将所有这些行标记为一个变体。

def mark_variants(df):
single_prods = df["ArtikelNr"].unique()
varianten = pd.DataFrame()
non_varianten = pd.DataFrame()
for prod in single_prods:
filtered_prods = df[df.ArtikelNr == prod]
if len(filtered_prods["ArtikelNr"]) > 1:
varianten = pd.concat([varianten, filtered_prods])
else:
non_varianten = pd.concat([non_varianten, filtered_prods])
varianten["variante"] = 1
non_varianten["variante"] = 0
return pd.concat([varianten, non_varianten])

在for循环中多次连接数据帧,这在计算上很昂贵。

你没有提供一个可重复的例子,所以我不能为自己测试,但是:

  • 使用列表代替空数据帧实例化variantennon_varianten
  • ,并且只在for循环结束后才进行连接。

可能会加快速度。

你可以这样重构你的函数并尝试一下:

def mark_variants(df):
single_prods = df["ArtikelNr"].unique()
varianten = []
non_varianten = []
for prod in single_prods:
filtered_prods = df[df.ArtikelNr == prod]
if len(filtered_prods["ArtikelNr"]) > 1:
varianten.append(filtered_prods)
else:
non_varianten.append(filtered_prods)
varianten = pd.concat(varianten)
non_varianten = pd.concat(non_varianten)
varianten["variante"] = 1
non_varianten["variante"] = 0
return pd.concat([varianten, non_varianten])

最新更新