从 iterrows() 变得更快 "nested -Pythonish- loops"
Going from iterrows() to faster "nested -Pythonish- loops"
我正在尝试将一段代码从 iterrows() 发展到更快的东西,因为我有一个嵌套循环,复杂性太大了。
我发现 apply 和 vectorization 更好,但无法理解如何使其适用于嵌套循环。
这是我现在正在做的事情。
clean = df.drop_duplicates(subset = "DESCRIPTION", keep = "first")
clean = clean.drop_duplicates(subset = "IMAGES", keep = "first")
##methode naive et un poil onereuse (n^2) pour ajouter les donnees extraites
for index, crow in tqdm(clean.iterrows()):
for drow in df.iterrows():
if crow["DESCRIPTION"] == drow[1]["DESCRIPTION"] or (crow["IMAGES"] == drow[1]["IMAGES"] and crow["IMAGES"] != []):
if crow["CRAWL_SOURCE"] != drow[1]["CRAWL_SOURCE"] and crow["CRAWL_SOURCE"] not in drow[1]["CRAWL_SOURCE"]:
clean.loc[index, "CRAWL_SOURCE"] = crow["CRAWL_SOURCE"] + " " + drow[1]["CRAWL_SOURCE"]
我正在删除重复项并将干净的数据集保存在“干净”变量中。
由于我仍然需要从重复项中保留一些数据,因此我 运行 一个嵌套循环以从未更改的原始 df 中取回我需要的内容。
我是 Python 的新手,所以我可能做错了,但我想矢量化这个嵌套循环。
绿色是 DESCRIPTION 字段,它会创建重复项。
数据集“clean”没有重复,它来自数据集“df”。
数据集“df”包含双打以及他们拥有的附加数据。
我最后想要的是“干净”数据集包含可以在“df”的“CRAWL_SOURCE”列中找到的附加信息
像这样:
第一行没有重复,所以它只有 1 个黄色值。
第二行有重复,所以我添加了信息。
如果数据帧 "clean" 来自数据帧 "df" 那么您只需要删除重复项并获得所有信息。
df_clean = df.drop_duplicates(subset = ["columnX", "columnY"], keep = "first").drop_duplicates(subset = "DESCRIPTION", keep = "first")
如果不是这种情况,您可以简单地加入或合并要添加回来的信息,如下所示:
df_result = df_clean.reset_index().merge(df, on=["DESCRIPTION","CRAWL_SOURCE"], how="left").set_index("index")
请注意,"on=[]" 参数需要您要匹配的列表。
根据我从你的代码中了解到的情况,你希望每个 IMAGE
都有一行,所有 CRAWL_SOURCE
匹配 IMAGE
或 DESCRIPTION
出现在这个 IMAGE
的一个实例中,即使它是另一个 IMAGE
。如果我误会了你,评论我会删除它,但这是我想出的(我知道它很乱,也许有人会找到 'cleaner' 方式):
import itertools
df1 = df.groupby(['IMAGES']).agg(lambda x: list(x))['CRAWL_SOURCE'].reset_index()
df2 = df.groupby(['DESCRIPTION']).agg(lambda x: list(x))
['CRAWL_SOURCE'].reset_index()
clean = df.merge(df1.rename({'CRAWL_SOURCE': 'CSI'}, axis=1), how='left').merge(df2.rename({'CRAWL_SOURCE': 'CSD'}, axis=1), how='left')
clean['CRAWL_SOURCE'] = clean['CSI'] + clean['CSD']
clean = clean.groupby(['IMAGES'])\
.agg(lambda x: ' '.join(list(set(list(itertools.chain.from_iterable(x))))))
['CRAWL_SOURCE'].reset_index()
我正在尝试将一段代码从 iterrows() 发展到更快的东西,因为我有一个嵌套循环,复杂性太大了。
我发现 apply 和 vectorization 更好,但无法理解如何使其适用于嵌套循环。
这是我现在正在做的事情。
clean = df.drop_duplicates(subset = "DESCRIPTION", keep = "first")
clean = clean.drop_duplicates(subset = "IMAGES", keep = "first")
##methode naive et un poil onereuse (n^2) pour ajouter les donnees extraites
for index, crow in tqdm(clean.iterrows()):
for drow in df.iterrows():
if crow["DESCRIPTION"] == drow[1]["DESCRIPTION"] or (crow["IMAGES"] == drow[1]["IMAGES"] and crow["IMAGES"] != []):
if crow["CRAWL_SOURCE"] != drow[1]["CRAWL_SOURCE"] and crow["CRAWL_SOURCE"] not in drow[1]["CRAWL_SOURCE"]:
clean.loc[index, "CRAWL_SOURCE"] = crow["CRAWL_SOURCE"] + " " + drow[1]["CRAWL_SOURCE"]
我正在删除重复项并将干净的数据集保存在“干净”变量中。 由于我仍然需要从重复项中保留一些数据,因此我 运行 一个嵌套循环以从未更改的原始 df 中取回我需要的内容。
我是 Python 的新手,所以我可能做错了,但我想矢量化这个嵌套循环。
我最后想要的是“干净”数据集包含可以在“df”的“CRAWL_SOURCE”列中找到的附加信息
像这样:
第一行没有重复,所以它只有 1 个黄色值。 第二行有重复,所以我添加了信息。
如果数据帧 "clean" 来自数据帧 "df" 那么您只需要删除重复项并获得所有信息。
df_clean = df.drop_duplicates(subset = ["columnX", "columnY"], keep = "first").drop_duplicates(subset = "DESCRIPTION", keep = "first")
如果不是这种情况,您可以简单地加入或合并要添加回来的信息,如下所示:
df_result = df_clean.reset_index().merge(df, on=["DESCRIPTION","CRAWL_SOURCE"], how="left").set_index("index")
请注意,"on=[]" 参数需要您要匹配的列表。
根据我从你的代码中了解到的情况,你希望每个 IMAGE
都有一行,所有 CRAWL_SOURCE
匹配 IMAGE
或 DESCRIPTION
出现在这个 IMAGE
的一个实例中,即使它是另一个 IMAGE
。如果我误会了你,评论我会删除它,但这是我想出的(我知道它很乱,也许有人会找到 'cleaner' 方式):
import itertools
df1 = df.groupby(['IMAGES']).agg(lambda x: list(x))['CRAWL_SOURCE'].reset_index()
df2 = df.groupby(['DESCRIPTION']).agg(lambda x: list(x))
['CRAWL_SOURCE'].reset_index()
clean = df.merge(df1.rename({'CRAWL_SOURCE': 'CSI'}, axis=1), how='left').merge(df2.rename({'CRAWL_SOURCE': 'CSD'}, axis=1), how='left')
clean['CRAWL_SOURCE'] = clean['CSI'] + clean['CSD']
clean = clean.groupby(['IMAGES'])\
.agg(lambda x: ' '.join(list(set(list(itertools.chain.from_iterable(x))))))
['CRAWL_SOURCE'].reset_index()