[英]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 comprehension
和re.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.