簡體   English   中英

將行移動到另一個 dataframe 時如何加快 Pandas 包含

[英]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`

  1. 試試Vaex ,作為 pandas 的替代品,inte.net 說它比 pandas 對於字符串操作更快。

  2. 您可以嘗試的其他選項是對查詢執行 set_index。 我不知道您的查詢列的性質,所以無法確定這是否有幫助。 如果您的查詢屬於定義的集合,將其設置為索引將減少要檢查的行,訪問該索引可以獲得所有行

  3. 您也可以將正則表達式更改為 $'thomas\s?-?cook'^ 並檢查

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM