从 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 匹配 IMAGEDESCRIPTION 出现在这个 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()