gpt4 book ai didi

python - 更快地替代 iterrows

转载 作者:太空宇宙 更新时间:2023-11-03 11:16:14 25 4
gpt4 key购买 nike

我知道这个话题已经被讨论了一千次了。但我想不出解决办法。

我正在尝试计算列表(df1.list1 的每一行)在列表 (df2.list2) 的列中出现的频率。所有列表仅包含唯一值。 List1 包括大约 300.000 行和 list2 30.000 行。

我有一个可以工作的代码,但速度非常慢(因为我使用的是 iterrows)。我也试过 itertuples() 但它给了我一个错误(“解压的值太多(预期 2)”)。我在网上发现了一个类似的问题:Pandas counting occurrence of list contained in column of lists .在提到的情况下,该人仅考虑在一列列表中出现一个列表。但是,我无法解决问题,因此将 df1.list1 中的每一行与 df2.list2 进行比较。

这就是我的列表的样子(简化):

df1.list1

0 ["a", "b"]
1 ["a", "c"]
2 ["a", "d"]
3 ["b", "c"]
4 ["b", "d"]
5 ["c", "d"]


df2.list2

0 ["a", "b" ,"c", "d"]
1 ["a", "b"]
2 ["b", "c"]
3 ["c", "d"]
4 ["b", "c"]

我想要的是:

df1

    list1         occurence   
0 ["a", "b"] 2
1 ["a", "c"] 1
2 ["a", "d"] 1
3 ["b", "c"] 3
4 ["b", "d"] 1
5 ["c", "d"] 2

这就是我到目前为止所得到的:

for index, row in df_combinations.iterrows():
df1.at[index, "occurrence"] = df2["list2"].apply(lambda x: all(i in x for i in row['list1'])).sum()

有什么可以加快速度的建议吗?提前致谢!

最佳答案

这应该快得多:

df = pd.DataFrame({'list1': [["a","b"],
["a","c"],
["a","d"],
["b","c"],
["b","d"],
["c","d"]]*100})
df2 = pd.DataFrame({'list2': [["a","b","c","d"],
["a","b"],
["b","c"],
["c","d"],
["b","c"]]*100})

list2 = df2['list2'].map(set).tolist()

df['occurance'] = df['list1'].apply(set).apply(lambda x: len([i for i in list2 if x.issubset(i)]))

使用您的方法:

%timeit for index, row in df.iterrows(): df.at[index, "occurrence"] = df2["list2"].apply(lambda x: all(i in x for i in row['list1'])).sum()

1 loop, best of 3: 3.98 s per loop Using mine:

%timeit list2 = df2['list2'].map(set).tolist();df['occurance'] = df['list1'].apply(set).apply(lambda x: len([i for i in list2 if x.issubset(i)]))

10 loops, best of 3: 29.7 ms per loop

请注意,我将列表的大小增加了 100 倍。

编辑

这个看起来更快:

list2 = df2['list2'].sort_values().tolist()
df['occurance'] = df['list1'].apply(lambda x: len(list(next(iter(())) if not all(i in list2 for i in x) else i for i in x)))

和时间:

%timeit list2 =  df2['list2'].sort_values().tolist();df['occurance'] = df['list1'].apply(lambda x: len(list(next(iter(())) if not all(i in list2 for i in x) else i for i in x)))

100 loops, best of 3: 14.8 ms per loop

关于python - 更快地替代 iterrows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51149735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com