首页 > 解决方案 > 替换包含特定标签的列中的值并替换它们

问题描述

我有一个 pandas 数据框,其中有一列名为 period 的列有 3 个不同的标签值,这意味着 2019 年冬季、2020 年冬季和 2021 年冬季,如下所示

我的问题是如何将这种格式替换为 2019 年冬季、2020 年冬季和 2021 年冬季的最终结果?

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

Q 表示一年中的一个季度

所以我的方法是:1)首先是用正则表达式方法来制作一个新年专栏。我在第一个 Q4 之后提取了 '19、'20、'21 年的数字

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

但没用,我欢迎任何意见和建议谢谢

标签: pythonstringpandasreplace

解决方案


我会在这里使用正则表达式捕获组。看看这个正则表达式:

(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

推荐阅读