【问题标题】:Issues with extracting substrings of a string in Python Pandas Dataframe在 Python Pandas Dataframe 中提取字符串的子字符串的问题
【发布时间】:2018-09-28 23:03:43
【问题描述】:

我有一个表达式,例如(一列的一行,在 pandas 数据框中说“old_col”)(显示数据框一列的前两行 )

abcd_6.9_uuu ghaha_12.8 _sksks

abcd_5.2_uuu ghaha_13.9 _sksks

我试图在数据帧上使用 str.extract 来获取两个浮点数。但是我发现了两个问题,只有第一个被选中(第一行 6.9 和第二行 5.2)

1. 那我该怎么做呢?

2. 另外,我怎样才能使提取方法通用以提取任何数字的数字(5.7 或 12.9 无关)

我正在使用: df['newcol'] = df['old_col'].str.extract('(_\d.\d)')

【问题讨论】:

    标签: python regex pandas pandas-groupby


    【解决方案1】:

    要获得多于一位,

    df['col'].str.extract('(\_\d+\.\d+)')
    
        col
    0   _6.9
    1   _15.9
    

    要获取所有匹配项,请使用str.extractall

    df['col'].str.extractall('(\_\d+\.\d+)')
    
                col
        match   
    0   0      _6.9
        1     _12.8
    1   0     _15.9
        1     _13.9
    

    分配回df:

    s = df['col'].str.extractall('(\_\d+\.\d+)')['col']
    df['new_col'] = s.groupby(s.index.get_level_values(0)).agg(list)
    

    【讨论】:

    • 非常感谢 RafaelC.. 但是当我使用您的 extractall 方法时,我收到一个错误:TypeError: incompatible index of inserted column with frame index
    • extract 方法可以很好地获得第一个.. 但是 extractall 不起作用
    • 不确定如何引发此错误。您是在 完全 运行我发布的代码,还是试图将此值分配回 df?检查已编辑..
    • 我正在尝试运行:df['new_col'] = df['col'].str.extractall('(_\d+\.\d+)')
    • 您可以简单地使用堆栈,然后分配给两列,而不是分组。类似 df[['f1','f2']]=df['col'].str.extractall('(\d+.\d+?)').unstack() +1
    【解决方案2】:

    你可以使用Series.str.findall:

    import pandas as pd
    df=pd.DataFrame({'old_col':['abcd_6.9_uuu ghaha_12.8 _sksks','abcd_5.2_uuu ghaha_13.9 _sksks']})
    df['newcol'] = df['old_col'].str.findall(r'\d+(?:\.\d+)?')
    df['newcol_str'] = df['old_col'].str.findall(r'\d+(?:\.\d+)?').str.join(', ')
    # >>> df
    #                           old_col       newcol newcol_str
    # 0  abcd_6.9_uuu ghaha_12.8 _sksks  [6.9, 12.8]  6.9, 12.8
    # 1  abcd_5.2_uuu ghaha_13.9 _sksks  [5.2, 13.9]  5.2, 13.9
    

    正则表达式详细信息

    • \d+(?:\.\d+)? - 一位或多位数字后跟可选的 . 和一位或多位数字
    • \d+\.\d+仅匹配浮点值,其中 . 必须在至少两位数之间。

    由于.str.findall(r'\d+(?:\.\d+)?') 返回一个列表,newcol 列包含列表,.str.join(', ')newcol_str 列包含与找到的匹配合并的字符串。

    如果您必须检查数字是否出现在下划线之间,请将它们添加到模式的两侧并用括号将数字匹配模式括起来:

    .str.findall(r'_(\d+(?:\.\d+)?)_')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-23
      • 2016-06-01
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 2020-04-18
      • 2023-01-07
      • 2016-06-25
      相关资源
      最近更新 更多