python - 根据模式替换某些值并在熊猫中提取子字符串
问题描述
带有 col1 的Pandas Dataframe包含各种日期
col1
Q2 '20
Q1 '21
May '20
June '20
25/05/2020
Q4 '20+Q1 '21
Q2 '21+Q3 '21
Q4 '21+Q1 '22
我想替换col1
匹配模式中的某些值。对于包含带有“+”的 2 个季度的值,我想返回字符串中的季节加上模式中包含的第一年。我想保持其他值不变。
例如:
1) Q4 '20+Q1 '21 应该是'Winter 20'
2) Q2 '21+Q3 '21 应该是'Summer 21'
3) Q4 '21+Q1 '22 应该是'Winter 21'
期望的输出:
col1
Q2 '20
Q1 '21
May '20
June '20
25/05/2020
Winter 20
Summer 20
Winter 21
我尝试了几种方法,例如替换、拆分、提取。但我没有解决问题。使用字典不会有帮助,因为 df 非常大,有很多 Q4 'XX+Q1 'XX 和 Q2 'XX +Q3 'XX 的变体
解决方案
您可以为每个季节匹配多个模式:
df = pd.DataFrame({'col1': [
"Q2 '20",
"Q1 '21",
"May '20",
"June '20",
"25/05/2020",
"Q4 '20+Q1 '21",
"Q2 '21+Q3 '21",
"Q4 '21+Q1 '22"]})
seasons = {
r"Q4 '(\d*)\+Q1 .*": r'Winter \1',
r"Q1 '(\d*)\+Q2 .*": r'Spring \1',
r"Q2 '(\d*)\+Q3 .*": r'Summer \1',
r"Q3 '(\d*)\+Q4 .*": r'Autumn \1'
}
df.col1.replace(seasons, regex=True)
0 Q2 '20
1 Q1 '21
2 May '20
3 June '20
4 25/05/2020
5 Winter 20
6 Summer 21
7 Winter 21
或者我认为更有效的另一个版本,因为我只匹配一个正则表达式,但我使用全局变量,所以我不确定哪个版本更好。
seasons = {
'Q4Q1': 'Winter',
'Q1Q2': 'Spring',
'Q2Q3': 'Summer',
'Q3Q4': 'Autumn'
}
pattern = re.compile(r"(Q\d) '(\d*)\+(Q\d) .*")
def change_to_season(row):
match = pattern.match(row)
if match:
season = seasons[match.group(1) + match.group(3)]
year = match.group(2)
return season + ' ' + year
else:
return row
df.col1.apply(change_to_season)
推荐阅读
- javascript - jest 无法使用主入口点定位模块
- tableau-api - 如何在 Tableau 计算中排除不适用的值
- java - 在运行时设置 JTable 行的颜色
- jmeter - 通过jmeter记录的Window Popup负载测试
- excel - 设置IF条件以触发excel vba中的宏
- android - Firebase In App Messaging 消息未显示
- c# - 将响应转发到不同的 URL 时,在 API 管理策略表达式中将响应正文从 XML 转换为 Json
- c# - 升级到 PackageReference 后,Nuget Pack 失败并显示代码 NU5012
- python - 如何保持第一次出现在python数据框中重复的值?
- c# - 使用 C# 连接 MySQL Server 8.0