![](/img/trans.png)
[英]How to speed up rolling diff in Pandas when applied to segments of DataFrame
[英]How to speed up Pandas contains when moving rows to another dataframe
我有一個小腳本,用於檢查條件,如果為真,則將 pandas dataframe 行移動到新的 dataframe,然后從原始 dataframe 中刪除該行。
最初,我正在使用這個正則表達式,但是速度很慢,在閱讀了一些內容之后,我嘗試了這種方式 - 它稍微快一些。
我正在使用的生產數據在數百萬行中運行,因此節省的任何時間都會有很大幫助。
我可以做些什么來進一步優化它嗎?
import pandas as pd
data = [['thomas cook', 222], ['holidays', 333], ['cheap flights', 444], ['thomascook holidays', 555]]
df1 = pd.DataFrame(data, columns=['query', 'clicks'])
df2 = pd.DataFrame(columns=df1.columns)
print(df1)
query clicks
0 thomas cook 222
1 holidays 333
2 cheap flights 444
3 thomascook holidays 555
brand_terms = ['thomas cook', 'thomascook', 'thomas-cook']
for brand_term in brand_terms:
condtion = df1[df1["query"].str.contains(brand_term, case=False, regex=False)]
df2 = df2.append(condtion, ignore_index=True)
df1.drop(condtion.index, inplace=True)
print(df1)
query clicks
1 holidays 333
2 cheap flights 444
print(df2)
query clicks
0 thomas cook 222
1 thomascook holidays 555
您可以使用str.contains()
並且不要更改regex
參數:
df2=(df1.loc[df1["query"].str.contains(pat='|'.join(brand_terms), case=False)]
.reset_index(drop=True))
df2 的 output:
query clicks
0 thomas cook 222
1 thomascook holidays 555
更新:
您可以為此使用~
(按位否定運算符)(例如):
df1=(df1.loc[~df1["query"].str.contains(pat='|'.join(brand_terms), case=False)])
.reset_index(drop=True)
筆記:
為了簡單性和性能,將您的條件存儲在變量中:
m=df1["query"].str.contains(pat='|'.join(brand_terms), case=False)
df1=df1.loc[~m].reset_index(drop=True)
df2=df1.loc[m].reset_index(drop=True)
嘗試使用 Modin。 只需一行代碼,它肯定會提高性能。Modin 將 Pandas 查詢加速了 4 倍。
import modin.pandas as pd
這里有一篇入門文章: https://www.kdnuggets.com/2019/11/speed-up-pandas-4x.html`
試試Vaex ,作為 pandas 的替代品,inte.net 說它比 pandas 對於字符串操作更快。
您可以嘗試的其他選項是對查詢執行 set_index。 我不知道您的查詢列的性質,所以無法確定這是否有幫助。 如果您的查詢屬於定義的集合,將其設置為索引將減少要檢查的行,訪問該索引可以獲得所有行
您也可以將正則表達式更改為 $'thomas\s?-?cook'^ 並檢查
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.