【问题标题】:Issues with try/except, attempting to convert strings to integers in pandas data frame where possibletry/except 的问题,在可能的情况下尝试将字符串转换为 pandas 数据框中的整数
【发布时间】:2017-03-01 07:05:44
【问题描述】:

我创建了一个函数来清除数据框中字符串中的任何 HTML 代码/标签。该函数从数据框中获取每个值,使用 remove_html 函数对其进行清理,并返回一个干净的 df。在将数据帧转换为字符串值并对其进行清理后,我尝试将数据帧中的值尽可能转换回整数。我试过 try/except 但没有得到我想要的结果。这是我目前拥有的:

def clean_df(df):
    df = df.astype(str)
    list_of_columns = list(df.columns)
    for col in list_of_columns:
        column = []
        for row in list(df[col]):
            column.append(remove_html(row))
            try:
                return int(row)
            except ValueError:
                pass

        del df[col]

        df[col] = column

    return df

如果没有 try/except 语句,该函数将返回一个干净的 df,其中整数是字符串。所以它只是 try/except 语句似乎是一个问题。我已经以多种方式尝试了 try/except 语句,但它们都没有返回 df。例如,当前代码返回一个“int”对象。

【问题讨论】:

    标签: python pandas try-except


    【解决方案1】:

    columm.append 插入try:

    for col in list_of_columns:
        column = []
        for row in list(df[col]):
            try:
                column.append(remove_html(row))
            except ValueError:
                pass
    
        del df[col]
    
        df[col] = column
    
    return df
    

    【讨论】:

    • 感谢您的帮助。不幸的是,这会返回一个 int 对象而不是 df。
    • 好吧,你把你的代码告诉return int(row),我把它从你的初始代码中取出来了..
    【解决方案2】:

    考虑pd.DataFramedf

    df = pd.DataFrame(dict(A=[1, '2', '_', '4']))
    

    您想使用函数 pd.to_numeric...
    注意
    pd.to_numeric 对标量和 pd.Series 进行操作。它不适用于pd.DataFrame

    使用参数errors='coerce' 获取您可以获取的数字和NaN 其他地方。

    pd.to_numeric(df['A'], 'coerce')
    
    0    1.0
    1    2.0
    2    NaN
    3    4.0
    Name: A, dtype: float6
    

    或者,在可能的地方获取数字,以及在其他地方已经拥有的数字

    pd.to_numeric(df['A'], 'coerce').combine_first(df['A'])
    
    0    1
    1    2
    2    _
    3    4
    Name: A, dtype: object
    

    然后您可以将其分配回您的df

    df['A'] = pd.to_numeric(df['A'], 'coerce').combine_first(df['A'])
    

    【讨论】:

      【解决方案3】:

      像这样工作:

      def clean_df(df):
      df = df.astype(str)
      list_of_columns = list(df.columns)
      for col in list_of_columns:
          column = []
          for row in list(df[col]):
              try:
                  column.append(int(remove_html(row)))
              except ValueError:
                  column.append(remove_html(row))
      
          del df[col]
      
          df[col] = column
      
      return df
      

      【讨论】:

        【解决方案4】:

        在函数中使用 try/except 并将该函数与 DataFrame.applymap() 一起使用

        df = pd.DataFrame([['a','b','1'],
                           ['2','c','d'],
                           ['e','3','f']])
        def foo(thing):
            try:
                return int(thing)
            except ValueError as e:
                return thing
        
        >>> df[0][2]
        'e'
        >>> df[0][1]
        '2'
        >>> df = df.applymap(foo)
        >>> df[0][2]
        'e'
        >>> df[0][1]
        2
        >>>
        

        【讨论】:

          猜你喜欢
          • 2018-11-07
          • 2013-11-20
          • 2011-04-28
          • 2021-02-11
          • 2017-01-29
          • 2022-01-01
          • 2011-05-05
          • 1970-01-01
          • 2012-08-02
          相关资源
          最近更新 更多