替换包含特定标签的列中的值并替换它们

2024-06-02 15:35:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为period的数据框,有3个不同的标签值,分别是2019年冬季、2020年冬季和2021年冬季,如下所示

我的问题是,如何用最终结果2019年冬季、2020年冬季和2021年冬季来取代这种格式?你知道吗

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

Q是指一年中的一个季度

所以我的方法是: 1) 首先是regex方法来制作新年专栏。我提取了第一季度之后的19年、20年、21年的数字

gas['year'] = gas['Period'].str.extract("([']\d\d)", expand=True)

然后我计划用winter替换包含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

但没有工作,我欢迎任何意见和建议 谢谢


Tags: 数据方法格式标签gregorianregexperiodgas
2条回答

我会在这里使用regex capture groups。看看这个正则表达式:

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

括号中的每个项目都是一个组,您可以在匹配后访问该组。例如,在Q4 '19+Q1 '20中,匹配的第一组是Q4,第二组是19,第三组是Q1,第四组是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)

这就产生了:

0    Winter 19
1    Spring 20
2    Winter 20
3    Winter 21

因此,我为生成自己的版本来查找所有月份并对其进行格式化,结果是: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)

抱歉,卢克可能又要打扰你了

相关问题 更多 >