我有
df.columns
Index(['location', 'date',
'deaths_2020_all_ages', 'average_deaths_2015_2019_all_ages',
'deaths_2015_all_ages', 'deaths_2016_all_ages', 'deaths_2017_all_ages',
'deaths_2018_all_ages', 'deaths_2019_all_ages', 'deaths_2010_all_ages',
'deaths_2011_all_ages', 'deaths_2012_all_ages', 'deaths_2013_all_ages',
'deaths_2014_all_ages', 'Week', 'deaths_2021_all_ages', 'w'],
dtype='object')
我想將諸如“deaths_2014_all_ages”之類的死亡列重命名為“2014”。
我試過這個
cols =[x for x in df.columns[df.columns.str.extract(r'([ab])?(\d)')]]
# KeyError: 2
和
cols =[x for x in df.columns[df.columns.str.replace('[a-z] _\d{4}_[a-z] _[a-z] ', '\d{4}', regex=True)]]
# KeyError: '\\d'
# error: bad escape \d at position 0
有什么建議嗎?謝謝。
uj5u.com熱心網友回復:
假設您只想從以“death”開頭的列中提取日期,您可以使用正則運算式(此處:第一個數字或完整字串,如果不以“death”開頭):
df.columns = df.columns.str.extract('(\d |^(?!death).*$)', expand=False)
之前的列:
Index(['location', 'date', 'deaths_2020_all_ages',
'average_deaths_2015_2019_all_ages', 'deaths_2015_all_ages',
'deaths_2016_all_ages', 'deaths_2017_all_ages', 'deaths_2018_all_ages',
'deaths_2019_all_ages', 'deaths_2010_all_ages', 'deaths_2011_all_ages',
'deaths_2012_all_ages', 'deaths_2013_all_ages', 'deaths_2014_all_ages',
'Week', 'deaths_2021_all_ages', 'w'],
dtype='object')
之后的列:
Index(['location', 'date', '2020', 'average_deaths_2015_2019_all_ages', '2015',
'2016', '2017', '2018', '2019', '2010', '2011', '2012', '2013', '2014',
'Week', '2021', 'w'],
dtype='object')
uj5u.com熱心網友回復:
如果您要重命名的所有列都具有這種確切的格式并且您不想重命名包含平均值的列,您可以這樣做(作為不需要正則運算式的選項):
cols = [ c.split("_")[1] if "deaths_" in c else c for c in df.columns ]
在較小的示例中,它看起來像:
>>> df.columns = [ "deaths_123_all", "deaths_456_all", "w" ]
>>> [ c.split("_")[1] if "deaths_" in c else c for c in df.columns ]
[ "123", "456", "w" ]
uj5u.com熱心網友回復:
您可以使用
import re
df = df.rename(columns = lambda x: re.sub('^\D*(\d ).*', r'\1',x))
如果deaths_必須出現在數字之前,只需添加它:
df = df.rename(columns = lambda x: re.sub('^\D*deaths_(\d ).*', r'\1',x))
請參閱正則運算式演示。正^\D*(\d ).*則運算式匹配
^- 字串的開始\D*- 零個或多個非數字字符(\d )- 第一組:一位或多位數字.*- 線路的其余部分。
替換中的\1是對第 1 組值的反向參考。
您的正則運算式方法可以用
df = df.rename(columns = lambda x: re.sub('^.*?_(\d{4})_.*', r'\1',x))
# or
df = df.rename(columns = lambda x: re.sub('^.*?deaths_(\d{4})_.*', r'\1',x))
在哪里
^.*?_- 匹配字串的開頭,然后是除換行符之外的任何零個或多個字符,盡可能少,然后是_(\d{4})- 第一組:四位數_- 一個下劃線.*- 線路的其余部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/437190.html
標籤:python-3.x 正则表达式 熊猫 细绳 数据框
下一篇:如何創建一個長正整數
