我正在尝试将一段代码从iterrows()演变为更快的代码,因为我有一个嵌套循环,复杂性太大了。
我发现apply和向量化更好,但不知道如何在嵌套循环中工作。
这就是我现在要做的。
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"]
我正在删除重复项,并将干净的数据集保存在" clean“变量中。因为我仍然需要从副本中保留一些数据,所以我运行了一个嵌套循环,以从未更改的原始df中取回所需的数据。
我是Python的新手,所以我这样做可能是错误的,但我想向量化这个嵌套循环。
绿色是DESCRIPTION字段,它创建重复项。数据集"clean“没有重复,它来自数据集"df”。数据集"df“包含doubles以及它们拥有的附加数据。
最后,我希望“干净”的数据集包含可以在"df“的"CRAWL_SOURCE”列中找到的附加信息,如下所示:
第一行没有重复,所以它只有1个黄色的值。第二行有一个副本,所以我添加了信息。
发布于 2019-09-04 08:55:20
如果数据帧“干净”源自数据帧"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=[]“参数需要您想要匹配的列表。
发布于 2019-09-04 09:21:37
根据我从您的代码中所理解的,您希望每个IMAGE
都有一行,其中所有CRAWL_SOURCE
都与此IMAGE
的一个实例中出现的IMAGE
或DESCRIPTION
匹配,即使它是另一个IMAGE
。如果我弄错了,发表评论,我会删除这篇文章,但这是我想出来的(我知道它很混乱,也许有人会找到一种“更干净”的方法):
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()
https://stackoverflow.com/questions/57784224
复制相似问题