我試圖從 Pandas DataFrame 的列中看起來像這樣的短文本中提取出生年份和死亡年份:
firstname lastname (1937-2015)
我用這個代碼來獲得第一年:
data = re.findall(r'\d ', txt)
if len(data) > 0 :
data = float(data[0])
if data >= 1800 and data <= 2021 :
return data
return None
但我無法從文本中提取第二年。當我改變data[0]成data[1]例如,我有一個錯誤訊息“串列索引超出范圍”
uj5u.com熱心網友回復:
使用Series.str.extract您可以利用的通用正則運算式解決方案來提取 Pandas 中的第二年(從 1800 年到 2099 年)
import pandas as pd
df = pd.DataFrame({'col':['firstname lastname (1937-2015)']})
yr = r'(?:1[89][0-9]{2}|20[01][0-9]|202[01])'
df['second_year'] = df['col'].str.extract(fr'(?s)(?<!\d){yr}(?!\d).*?({yr})(?!\d)')
# => df['second_year']
# 0 2015
# Name: second_year, dtype: object
請參閱正則運算式演示。詳情:
(?s)-.現在跨行匹配(?<!\d)- 左側數字邊界(?:1[89][0-9]{2}|20[01][0-9]|202[01])- 從 1800 年到 2021 年(?!\d)- 右手數字邊界.*?- 任何文本,盡可能少的字符(1[89][0-9]{2}|20[01][0-9]|202[01])- 第 1 組(實際回傳結果Series.str.extract):1800 至 2021(?!\d)- 右手數字邊界
在這個具體案例中,一個簡單的
df['second_year'] = df['col'].str.extract(r'.*-(\d{4})')
就足夠了:任何文本(盡可能多的除換行符以外的字符),然后將 a-和四位數字捕獲到組 1 中。
請參閱此正則運算式演示。
uj5u.com熱心網友回復:
使用正則運算式從子短語中查找年份,然后將其拆分并索引第二年。您可以在資料框中使用它來申請分配給一列
txt="firstname lastname (1937-2015)"
pattern='(\d{4}\-\d{4}) '
matches=re.findall(pattern,txt)
print(matches[0].split('-')[1])
輸出
2015
uj5u.com熱心網友回復:
您可以定義 2 個捕獲組并檢查它們
df = pd.DataFrame(
{'txt': ['firstname lastname (1937-2015)', 'firstname lastname (1780-1820)',
'firstname lastname (1945-?)', 'firstname lastname (1980-2022)']})
df[['birth', 'death']] = df['txt'].str.extract(r'(\d )-(\d |\?)').replace({'?': None}).astype(float). \
applymap(lambda x: x if 1800 <= x <= 2021 else None)
print(df)
輸出:
txt birth death
0 firstname lastname (1937-2015) 1937.0 2015.0
1 firstname lastname (1780-1820) NaN 1820.0
2 firstname lastname (1945-?) 1945.0 NaN
3 firstname lastname (1980-2022) 1980.0 NaN
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/353673.html
上一篇:基礎bgp配置
