如何加快熊猫数据帧迭代

时间:2021-07-07 03:18:12

标签: python pandas multiprocessing

我们在项目中使用了pandas dataframe,我们意识到由于pandas dataframe 的计算速度很慢,我们的程序很慢。我与您分享了我们的代码。

desc_words_short

我们检查项目名称是否在另一列 df_item_in_desc 中,然后将该行附加到另一个数据框 (Cpu parallelization)。这是一个简单的逻辑,但要获得这样的行,我们应该遍历所有数据帧并检查该条件。我们的数据框有点大,运行此代码需要更多时间。我们如何加快这个过程,我们可以在这个任务中使用 telnet 还是其他什么?

<块引用>

注意:我们实际上尝试了 Cpu 并行化,但不会成功。

2 个答案:

答案 0 :(得分:1)

所以看起来您正在遍历每一行并查看 desc_words_short 列的值。对于每个值,如果该值(大概是一个列表)包含 item_number,那么您希望将该行添加到 df_item_in_desc

如果这是目标,您可以像这样加快速度:

import pandas as pd

item_number = 'a'
df = pd.DataFrame({'desc_words_short':[['a','a','b'],['b','d'],['c','c']]})

print(df)

  desc_words_short
0        [a, a, b]
1           [b, d]
2           [c, c]

mask = df['desc_words_short'].apply(lambda x: item_number in x)
df_item_in_desc = df.loc[mask]

print(df_item_in_desc)

  desc_words_short
0        [a, a, b]

我不确定 set 的意义是什么,因为 item_number 会出现在完整列表或集合中,所以这是一个毫无意义的额外计算

答案 1 :(得分:1)

您也可以使用列表理解。我们应该避免使用 df.apply 并将其作为最后的手段。

在更大的数据集上,列表理解会更快。此处回答的基准:link。答案本身就是智慧的瑰宝。

引用基准:

<块引用>
%timeit df[df.apply(lambda x: x['Name'].lower() in x['Title'].lower(), axis=1)]
%timeit df[[y.lower() in x.lower() for x, y in zip(df['Title'], df['Name'])]]

2.85 ms ± 38.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
788 µs ± 16.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
import pandas as pd
item_number = 'a'
df = pd.DataFrame({'desc_words_short':[['a','a','b'],['b','d'],['c','c']]})
df[[ item_number in x for x in df['desc_words_short']]]

数据框:

  desc_words_short
0        [a, a, b]
1           [b, d]
2           [c, c]

输出:

  desc_words_short
0        [a, a, b]

参考: https://stackoverflow.com/a/54432584/6741053