【问题标题】:Extracting Year and Month from a custom text field从自定义文本字段中提取年份和月份
【发布时间】:2023-03-17 17:22:01
【问题描述】:

我有一个数据框,其中有一列包含有关此人在组织中拥有帐户的年数/月数的信息。

该字段是自定义文本格式,

例如:'0yrs 11mon'、'15yrs 4mon' 等

有没有办法提取只是将年份和月份提取到单独的列中,如下所示:

Member Since | Year | Mon
-------------------------

'0yrs 11mon' | 0 | 11 
-------------------------------------------

'15yrs 4mon' | 15 | 4
---------------------

【问题讨论】:

    标签: python pandas dataframe series


    【解决方案1】:

    你可以使用Series.str.extract:

    df['Year'] = df['Member Since'].str.extract('(\d+)(?:yrs)')
    df['Mon'] = df['Member Since'].str.extract('(?:\s)(\d+)(?:mon)')
    

    ?: 是非捕获组表示法。这意味着它与正则表达式匹配,但不会在输出中捕获

    你也可以试试Series.str.extractall:

    df[['year','mon']]= df['Member Since'].str.extractall('(\d+)').unstack()
    df
      Member Since  year    mon
    0   0yrs 11mon   0      11
    1   15yrs 4mon   15      4
    

    extractall 函数实际上返回一个 DataFrame,其中每个匹配一个行,每个组一个列,因此您需要将其取消堆叠。

    仅当您有问题中显示的数字时,才使用提取所有方法。多于或少于两个将返回错误。

    【讨论】:

    • 谢谢 Mohit.. Extractall 工作,但提取不起作用.. 我收到错误“模式不包含捕获组”
    • 在这种情况下使用(\d+)(?:yrs)(?:\s)(\d+)(?:mon)。我已经对答案进行了更改。
    【解决方案2】:

    使用str.extract 解决方案的正则表达式替代方案将是,

    df["Year"] = df["Member Since"].str.extract("(\d+)yrs")
    df["Mon"] = df["Member Since"].str.extract("(\d+)mon")
    

    【讨论】:

      【解决方案3】:

      如果您有 excel 中的数据,那么这可以工作:-

      import pandas as pd
      data=pd.read_excel('filename')
      month=data['Mon']  
      year=data['Year']
      

      【讨论】:

        【解决方案4】:
        df[['year', 'month']] = df['Member Since'].str.split(' ').apply(lambda x: [''.join(re.findall(r'\d',i)) for i in x]).apply(pd.Series)
        

        输出

          Member Since year month
        0   0yrs 11mon    0    11
        1   15yrs 4mon   15     4
        

        【讨论】:

          【解决方案5】:

          使用str.findall

          pd.DataFrame(df['Member Since'].str.findall('\d+').tolist(),columns=['Year','Mon'])
            Year Mon
          0    0  11
          1   15   4
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-09-11
            • 1970-01-01
            • 1970-01-01
            • 2019-06-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-02
            相关资源
            最近更新 更多