簡體   English   中英

python數據框中的正則表達式:計算模式的出現次數

[英]Regex in python dataframe: count occurences of pattern

我想計算一個正則表達式(需要先驗和隨后的字符來識別模式)在多個數據框列中出現的頻率。 我找到了一個似乎有點慢的解決方案。 有沒有更高級的方法?

列_A 列_B 列_C
測試 • 測試 abc 冬天的太陽 雪 雨 空白
blabla • 夏天 abc 中斷 • 數據 測試信•停止。

到目前為止,我創建了一個緩慢的解決方案:

print(df["column_A"].str.count("(?<=[A-Za-z]) • (?=[A-Za-z])").sum() + df["column_B"].str.count("(?<=[A-Za-z]) • (?=[A-Za-z])").sum() + df["column_C"].str.count("(?<=[A-Za-z]) • (?=[A-Za-z])").sum())

您可以使用list comprehensionre.search 您可以將938 µs減少到26.7 µs (確保不要創建list並使用generator

res = sum(sum(True for item in df[col] if re.search("(?<=[A-Za-z]) • (?=[A-Za-z])", item))
       for col in ['column_A', 'column_B','column_C'])
print(res)
# 5

基准:

%%timeit 
sum(sum(True for item in df[col] if re.search("(?<=[A-Za-z]) • (?=[A-Za-z])", item)) for col in ['column_A', 'column_B','column_C'])
# 26 µs ± 2.2 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%%timeit 
df["column_A"].str.count("(?<=[A-Za-z]) • (?=[A-Za-z])").sum() + df["column_B"].str.count("(?<=[A-Za-z]) • (?=[A-Za-z])").sum() + df["column_C"].str.count("(?<=[A-Za-z]) • (?=[A-Za-z])").sum()
# 938 µs ± 149 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
# --------------------------------------------------------------------#

str.count應該能夠應用於整個數據幀,而無需以這種方式進行硬編碼。 嘗試

sum(df.apply(lambda x: x.str.count("(?<=[A-Za-z]) • (?=[A-Za-z])").sum()))

我嘗試過 1000 * 1000 個數據幀。 這是一個基准供您參考。

%timeit sum(df.apply(lambda x: x.str.count("(?<=[A-Za-z]) • (?=[A-Za-z])").sum()))
1.97 s ± 54.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

暫無
暫無

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

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