【问题标题】:Replacing value in a column that contains specific label and to replace them替换包含特定标签的列中的值并替换它们
【发布时间】:2019-04-22 06:47:36
【问题描述】:

我有一个 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)

然后我打算用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

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

【问题讨论】:

    标签: python string pandas replace


    【解决方案1】:

    我会在这里使用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
    

    【讨论】:

    • 你好,谢谢你的回复!刚刚尝试了代码并得到了这个错误'NoneType'对象没有属性'group'
    • 我猜您是针对您的df 而不是上面示例中的那个?该错误意味着正则表达式与 Period 值之一不完全匹配。我刚刚编辑了我的答案以添加更好的错误处理 - 即返回字符串“解析失败”而不是出错。
    • 嘿,我用我的原始数据框尝试了这个,它返回解析失败,因为我有第 4 季以外的东西。 (但在我的 4 个赛季中效果很好)我可以保留那些其他值吗?谢谢!
    • 是的,您可以将return 'Failed to parse' 更改为return x,这将保留该字段的原始值。很高兴我能帮上忙!
    • 谢谢你!问题解决了,一整天都在努力解决这个问题
    【解决方案2】:

    所以我制作了自己的版本来查找所有月份并格式化它们并得到:TypeError: unsupported operand type(s) for +: 'NoneType' and '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)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 2021-10-16
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多