我们在项目中使用了pandas dataframe,我们意识到由于pandas dataframe 的计算速度很慢,我们的程序很慢。我与您分享了我们的代码。
desc_words_short
我们检查项目名称是否在另一列 df_item_in_desc
中,然后将该行附加到另一个数据框 (Cpu parallelization
)。这是一个简单的逻辑,但要获得这样的行,我们应该遍历所有数据帧并检查该条件。我们的数据框有点大,运行此代码需要更多时间。我们如何加快这个过程,我们可以在这个任务中使用 telnet
还是其他什么?
注意:我们实际上尝试了 Cpu 并行化,但不会成功。
答案 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]