Замена значения в столбце, содержащем определенные метки, и их замена - PullRequest
0 голосов
/ 21 апреля 2019

У меня есть кадр данных pandas с столбцом, названным периодом с 3 различными значениями маркировки, что означает зиму 2019, зиму 2020 и зиму 2021, как показано ниже

У меня вопрос: как заменить этот формат с конечным результатом: зима 2019, зима 2020 и зима 2021?

Period:
Q4 '19+Q1 '20 
Q4 '20+Q1 '21
Q4 '21+Q1 '22

Q означает квартал в году

Итак, мой подход: 1) первым является метод регулярных выражений для создания столбца нового года. Я извлекаю номер 19, 20, 21 года после первого Q4

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

но не сработало, приветствую любые советы и предложения спасибо

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

, поэтому я создаю свою собственную версию для просмотра всех месяцев и форматирования их и получил это: 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)

извинитеЛюку, возможно, придется беспокоить тебя снова

0 голосов
/ 21 апреля 2019

Я хотел бы использовать группы захвата регулярных выражений здесь.Посмотрите на это регулярное выражение:

(Q[0-9]) '([0-9]{2})\+(Q[0-9]) '([0-9]{2})

Каждый элемент, заключенный в скобки, является группой, к которой вы можете получить доступ после сопоставления.Например, в Q4 '19+Q1 '20 первая группа в совпадении - Q4, вторая группа - 19, третья группа - Q1 и четвертая группа - 20.

После сопоставления ваших строк Period с этим регулярным выражением, вы можете извлечь групповые совпадения, чтобы создать желаемый выходной формат.Этот код дает вам полный пример того, как это сделать.

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)

Это дает:

0    Winter 19
1    Spring 20
2    Winter 20
3    Winter 21
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...