【问题标题】:Extract a group of n numbers from a string in a column从列中的字符串中提取一组 n 个数字
【发布时间】:2019-01-24 09:19:46
【问题描述】:

我在 pandas 数据框中有一列字符串,其中包含以下内容:"AU/4347001",但此外还有其他不太组织的字符串,例如 "Who would have thought this would be so 4347009 difficult"

因此,最终,这些数字序列在字符串中的出现位置和方式并没有连贯的模式。它们可能位于开头、中间或结尾,并且无法确切知道数字周围还有多少其他字符。

理想情况下,我想返回另一列仅包含数字的等长列。

这可能吗?

非常感谢任何帮助!

谢谢

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以extract:

    df =pd.DataFrame({'text':["Who would have thought this would be so 4347009 difficult",
                              "24 is me"]})
    
    df['new_col'] = df['text'].str.extract(r'(\d+)')
    
        text                                                new_col
    0   Who would have thought this would be so 434700...   4347009
    1   24 is me                                            24
    

    【讨论】:

      【解决方案2】:

      您可以将extract 与数字(\d+) 的捕获组一起使用:

      import pandas as pd
      
      data = ["AU/4347001",
              "Who would have thought this would be so 4347009 difficult",
              "Another with a no numbers",
              "131242143"]
      
      df = pd.DataFrame(data=data, columns=['txt'])
      result = df.assign(res=df.txt.str.extract('(\d+)')).fillna('')
      print(result)
      

      输出

                                                       txt        res
      0                                         AU/4347001    4347001
      1  Who would have thought this would be so 434700...    4347009
      2                          Another with a no numbers           
      3                                          131242143  131242143
      

      请注意,在上面的示例中,使用fillna 来填充那些没有找到数字组的列,在这种情况下,使用空字符串。

      【讨论】:

        【解决方案3】:

        这是我们的测试数据框:

        ### Create an example Pandas Dataframe
        df = pd.DataFrame(data=['something123', 'some456thing', '789somthing', 
                                'Lots of numbers 82849585 make a long sentence'], columns = ['strings'])
        
        ### Create a function for identifying, joining and then turning the string to an integer
        def get_numbers(string):
            return int(''.join([s for s in string if s.isdigit()]))
        
        ### Now lets apply the get_numbers function to the strings column
        df.loc[:,'strings_wo_numbers'] = df.loc[:,'strings']apply(get_numbers)
        

        注意:这将连接字符串中的所有数字,即“10 Olives and 5 apples”将变成 105 而不是 10、5。

        【讨论】:

          【解决方案4】:

          使用str.finall

          df.text.str.findall('\d+').str[0]
          0    4347009
          1         24
          Name: text, dtype: object
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-10-14
            • 1970-01-01
            • 1970-01-01
            • 2011-12-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多