![](/img/trans.png)
[英]Partial string match with str.contains using dict comprehension with python/pandas
[英]Pandas - using str.contains to match string
我的 pandas df 中有一列如下所示:
Cycle 1 (0 h)
A
B
C
Cycle 2 (0 h 43 min)
A
B
C
我正在嘗試匹配“循環”並提取數字。 理想情況下,我希望我的 output 看起來像這樣:
0
A
B
C
0,43
A
B
C
我試過了:
df['1'] = df['1'].str.contains('Cycle', regex=True).str.extract('(\d+)')
但它完全擺脫了循環線——我認為在提取數字后我可以使用str.split()
並只保留相關的數字,然后我可以用逗號分隔它們。 但我似乎無法提取數字。
您可以使用
rx = r'^Cycle\s+\d+\s+\((\d+)(?:\s*\w+\s*(\d+))?.*'
df['1'] = df['1'].str.replace(rx, lambda x: f'{x.group(1)},{x.group(2)}' if x.group(2) else x.group(1), regex=True)
請參閱正則表達式演示。 在這里,搜索^Cycle\s+\d+\s+\((\d+)(?:\s*\w+\s*(\d+))?.*
模式,如果有匹配項,則將其替換與第 1 組 + ,
+ 第 2 組內容,或僅第 1 組值取決於第 2 組是否匹配。
詳情:
^
- 字符串的開始Cycle
——一個字\s+
- 一個或多個空格\d+
- 一位或多位數字\s+
- 一個或多個空格\(
- 一個(
字符(\d+)
- 第 1 組 ( \1
):一個或多個數字(?:\s*\w+\s*(\d+))?
- 可選的非捕獲組匹配可選的序列
\s*\w+\s*
- 一個或多個包含一個或多個空白字符的單詞字符(\d+)
- 第 2 組 ( \2
):一位或多位數字.*
- 字符串的 rest。 如果 Group 2 匹配,則替換為 Group 1 + ,
+ Group 2 值,否則,它只是 Group 1 值。
Pandas測試:
import pandas as pd
df = pd.DataFrame({'1': ['Cycle 1 (0 h)', 'Cycle 1 (0 h 48 min)']})
rx = r'^Cycle\s+\d+\s+\((\d+)(?:\s*\w+\s*(\d+))?.*'
df['1'].str.replace(rx, lambda x: f'{x.group(1)},{x.group(2)}' if x.group(2) else x.group(1), regex=True)
# => 0 0
# => 1 0,48
# => Name: 1, dtype: object
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.