【问题标题】:Pandas series str.extract fails to match RegEx Pattern [duplicate]Pandas 系列 str.extract 无法匹配正则表达式模式 [重复]
【发布时间】:2019-08-28 07:34:04
【问题描述】:

以下是我的数据框的样子
mydf =

col1    Col2    Col3                 Col4 
0   val1    1x  \n\t\t\t\t\t\t3x\n\t\t\t\t\t    Calculate
1   val2    1x  \n\t\t\t\t\t\t3x\n\t\t\t\t\t    Calculate
2   val3    1x  \n\t\t\t\t\t\t12.5x\n\t\t\t\t\t Calculated
3   val4    1x  \n\t\t\t\t\t\t8x\n\t\t\t\t\t        Calculated
4   val5    1x  \n\t\t\t\t\t\t10x\n\t\t\t\t\t   Calculate
5   val18   1x  \n\t\t\t\t\t\t6.3x\n\t\t\t\t\t  Calculate

从 Col4 中,我想提取数字(包括小数位。

但是,正则表达式模式不适合我。

mydf[Col4].str.extract('[1-9]\d*(\.\d+)?') <br>

对于大多数行,它返回NaN,对于带有小数的行,它返回.5/.3(即,只是十进制值)

我已经尝试使用 re.search 来检查我的模式并且它有效。

newstr = mydf[col4][5] 
re.search('[1-9]\d*(\.\d+)?', newstr) 

newstr 变为 - '\n\t\t\t\t\t\t12.5x\n\t\t\t\t\t' (双反斜杠)。 以上返回

re.Match object; span=(14, 18), match='12.5'</b>

正如预期的那样。

看起来我遗漏了一些明显的东西。

【问题讨论】:

  • 您的数据框中有这些中断 (&lt;br&gt;)?我们可以删除它们吗?
  • 从 df 中删除了它们
  • 您的正则表达式与extract 完全兼容。它提取exclusively the capture group(\.\d+)?。你应该修改这个正则表达式。

标签: python regex pandas dataframe


【解决方案1】:

使用str.findall

df.Col3.str.findall(r'[-+]?\d*\.\d+|\d+').str[0]#notice here I also extract the sign
0       3
1       3
2    12.5
3       8
4      10
5     6.3
Name: Col3, dtype: object

【讨论】:

    【解决方案2】:

    看起来你也可以strip 并避免使用正则表达式

    df.Col3.str.strip().str[:-1]
    
    0       3
    1       3
    2    12.5
    3       8
    4      10
    5     6.3
    Name: Col3, dtype: object
    

    【讨论】:

    • 恐怕这不起作用,列不会因此而改变(剥离)。也许 Col3 是填充的(带有空格或其他东西)。
    • @Suraj_j strip 也应该注意空格等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多