我有一个熊猫数据框,其中的一个名为period的列具有3个不同的标签值,分别表示如下所示的2019年冬季,2020年冬季和2021年冬季
我的问题是我该如何替换这种格式,最终结果是2019年冬季,2020年冬季和2021年冬季?
Period:
Q4 '19+Q1 '20
Q4 '20+Q1 '21
Q4 '21+Q1 '22
Q表示一年中的四分之一
所以我的方法是: 1)首先是使用regex方法制作新的一年专栏。我在第一个Q4之后提取了'19,'20,'21年的数字
gas['year'] = gas['Period'].str.extract("([']\d\d)", expand=True)
然后我计划用冬季替换包含Q4和Q1的值
gas['Period'].str.contains('Q4')) & (gas['Period'].str.contains('Q1')) = 'winter Gregorian'
但它替换了包含Q4和Q1的整个行
也尝试过
gas[gas['Period'].str.replace("[Q][4]..\d\d[+][Q][1]", 'winter Gregorian'), regex =False]
和最终结果,我想要的是:
Period
winter Gregorian 2019
winter Gregorian 2020
winter Gregorian 2021
但是没有用,我欢迎任何建议。 谢谢
答案 0 :(得分:0)
我会在这里使用regex capture groups。看一下这个正则表达式:
(Q[0-9]) '([0-9]{2})\+(Q[0-9]) '([0-9]{2})
括号中的每个项目都是一个组,您可以在匹配后访问它们。例如,在Q4 '19+Q1 '20
中,比赛中的第一组为Q4
,第二组为19
,第三组为Q1
,第四组为{{ 1}}。
在将您的Period字符串与此正则表达式匹配之后,您可以拉出组匹配项以构建所需的输出格式。这段代码为您提供了执行此操作的完整示例。
20
给出:
import re
import pandas as pd
df = pd.DataFrame({
"Period": [
"Q4 '19+Q1 '20 ",
"Q1 '20+Q2 '20",
"Q4 '20+Q1 '21",
"Q4 '21+Q1 '22"
]
})
pattern = "(Q[0-9]) '([0-9]{2})\+(Q[0-9]) '([0-9]{2})"
season_map = {
('Q4', 'Q1'): 'Winter',
('Q1', 'Q2'): 'Spring',
('Q2', 'Q3'): 'Summer',
('Q3', 'Q4'): 'Fall'
}
def convert_time_format(x):
match = re.match(pattern, x)
if match is not None:
season = season_map.get((match.group(1), match.group(3)))
year = match.group(2)
return season + ' ' + year
else:
return 'Failed to parse'
df.Period.map(convert_time_format)
答案 1 :(得分:0)
所以我制作了自己的版本以查找所有月份并将其格式化,并得到以下信息:TypeError:+不支持的操作数类型:'NoneType'和'str'
pattern3 = "(\w+) '([0-9]{2})"
month_map = {
('January'): 'Jan',
('February'): 'Feb',
('March'): 'Mar',
('April'): 'Apr',
('June'): 'Jun',
('July'): 'Jul',
('August'): 'Aug',
('September'): 'Sep',
('October'): 'Oct',
('November'): 'Nov',
('December'): 'Dec',
}
def convert_month(x):
match = re.match(pattern3, x)
if match is not None:
month = month_map.get((match.group(1)))
year = '20'+match.group(2)
return month + '_' + year
else:
return x
gas['Period'] = gas.Period.map(convert_month)
对不起,卢克可能不得不再次打扰您