【问题标题】:extracting and replacing substring using regex in a pandas dataframe在熊猫数据框中使用正则表达式提取和替换子字符串
【发布时间】:2018-03-31 09:28:28
【问题描述】:

我有这个:

                                                Title  
Num                                                      
0    <span class="o-label--tiny">VALEUR ÉNERGÉTIQUE</span>   
1         <span class="o-label--tiny">PROTÉINES</span>   
2          <span class="o-label--tiny">GLUCIDES</span> 

<class 'pandas.core.frame.DataFrame'> Num Index(['Title'], dtype='object')

这就是我想要的:

            Title  
Num                                                      
0  VALEUR ÉNERGÉTIQUE   
1           PROTÉINES   
2            GLUCIDES 

这是我开发的正则表达式:

(<span class=\"o-label--tiny\">)([a-zA-Z]+\s*\w*)(</span>)

测试它我发现它与整个初始字符串匹配,并且具有不同子字符串的组。最后,我希望 group(2) 在我的数据框列中。 (我下面的示例显示了明确的正则表达式,但我也尝试了这些与 re.compile 结果,这也不能让我得到最终结果)。

这是我尝试过的:

df['Title'] = df['Title'].replace({'<span class=\"o-label--tiny\">': ''}, inplace=True, regex=True)

结果:

   Title                                                
Num                                                         
0    None  
1    None  
2    None  

尝试 2 号:

df['Title'] = df['Title'].str.replace('<span class=\"o-label--tiny\">', repl = '')

结果编号 2:

   Title  
Num                                                         
0     NaN  
1     NaN  
2     NaN

尝试 3 号:

df['Title'] = df[lambda df: df.columns[0]].str.extract('(>[a-zA-Z]+\s*\w*)', expand=False)

结果 3:

   Title  
Num                                                         
0     NaN  
1     NaN  
2     NaN

我真的看不出我做错了什么,如果能帮助我达到我想要的结果,我将不胜感激。谢谢!

【问题讨论】:

    标签: python pandas replace substring extract


    【解决方案1】:

    使用str.extract:

    df['Title']=df['Title'].str.extract('<span class=\"o-label--tiny\">(.*)</span>',expand=False)
    print (df)
                      Title
    Num                    
    0    VALEUR ÉNERGÉTIQUE
    1             PROTÉINES
    2              GLUCIDES
    

    如果可能,不同的tags 或classes:

    df['Title'] = df['Title'].str.extract('>(.*)<',expand=False)
    print (df)
                      Title
    Num                    
    0    VALEUR ÉNERGÉTIQUE
    1             PROTÉINES
    2              GLUCIDES
    

    【讨论】:

    • 我正要添加它作为评论。你编辑了它。我删除了我的答案
    • @jezrael:我试过你的代码,但都不适合我。我仍然得到 NaN 而不是正确的字符串。 ??
    • 我的琴弦是否有一些我没有考虑过的不寻常之处?
    • @ChiChi - 我不知道 - 是否可以通过 pickle 文件通过电子邮件将您的真实数据发送给我? df[['Title']].to_pickle('data.pkl') ?
    • @jezrael - 是的,我会这样做的。非常感谢您提供更仔细地查看它
    【解决方案2】:

    正则表达式

    我不想输入 df 的东西,但我希望这很有用:

    import re
    
    stringa = """
    0    <span class="o-label--tiny">VALEUR ÉNERGÉTIQUE</span>
    1         <span class="o-label--tiny">PROTÉINES</span>
    2          <span class="o-label--tiny">GLUCIDES</span>
    """
    
    pattern1 = "[0-9]"
    pattern = ">(.*)<"
    
    found = re.findall(pattern1, stringa)
    found2 = re.findall(pattern, stringa)
    
    for f in range(len(found)):
        print(found[f] + " " + found2[f])
    

    输出

    0 VALEUR ÉNERGÉTIQUE
    1 PROTÉINES
    2 GLUCIDES
    

    【讨论】:

      猜你喜欢
      • 2018-08-28
      • 2019-06-16
      • 2018-09-24
      • 2018-04-11
      • 2017-07-18
      • 2018-02-22
      • 2018-12-25
      • 2023-02-04
      • 2017-12-08
      相关资源
      最近更新 更多