Вы можете сопоставить несколько шаблонов, по одному для каждого сезона:
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)