Заменить определенные значения по шаблону и извлечь подстроку в pandas - PullRequest
0 голосов
/ 25 мая 2020

Pandas Dataframe с col1, который содержит различные даты

 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

Ответы [ 2 ]

1 голос
/ 25 мая 2020

Вы можете сопоставить несколько шаблонов, по одному для каждого сезона:

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)
0 голосов
/ 25 мая 2020
'''
col1
Q2 '20
Q1 '21
May '20
June '20
25/05/2020
Q4 '20+Q1 '21
Q2 '21+Q3 '21
Q4 '21+Q1 '22
'''

import pandas as pd

df = pd.read_clipboard(sep="!")

print(df)

Вывод:

           col1
0         Q2 '20
1         Q1 '21
2        May '20
3       June '20
4     25/05/2020
5  Q4 '20+Q1 '21
6  Q2 '21+Q3 '21
7  Q4 '21+Q1 '22

.

import re 

def regex_filter(val):
    regex = re.compile(r"([Q][1-4])+ '(\d+)\+([Q][1-4])+ '(\d+)")
    result = regex.split(val)
    result = [val for val in result if val]
    if 'Q3' in result:
        result = 'Summer '+result[-1]
    elif 'Q1' in result:
        result = 'Winter '+result[1]
    else:
        result = ''.join(result)

    return result

df['col1'] = df['col1'].apply(regex_filter)



print(df)

Вывод:

         col1
0      Q2 '20
1      Q1 '21
2     May '20
3    June '20
4  25/05/2020
5   Winter 20
6   Summer 21
7   Summer 21
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...