【问题标题】:Pandas cast all object columns to categoryPandas 将所有对象列转换为类别
【发布时间】:2017-02-15 17:22:22
【问题描述】:

我想要一个优雅的函数来将所有对象列转换为熊猫数据 框架到类别

df[x] = df[x].astype("category") 执行类型转换 df.select_dtypes(include=['object']) 将子选择所有类别列。但是,这会导致其他列丢失/需要手动合并。是否有“就地工作”或不需要手动转换的解决方案?

编辑

我正在寻找类似于 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.convert_objects.html 的东西来转换为分类数据

【问题讨论】:

    标签: python pandas casting categorical-data


    【解决方案1】:

    希望我可以将此添加为评论,但不能。

    接受的答案不适用于 pandas 0.25 及更高版本。使用.reindex 而不是reindex_axis。浏览此处获取更多信息: https://github.com/scikit-hep/root_pandas/issues/82

    【讨论】:

      【解决方案2】:

      我认为这是一种更优雅的方式:

      df = pd.DataFrame(dict(
              A=[1, 2, 3, 4],
              B=list('abcd'),
              C=[2, 3, 4, 5],
              D=list('defg')
          ))
      
      df.info()
      
      df.loc[:, df.dtypes == 'object'] =\
          df.select_dtypes(['object'])\
          .apply(lambda x: x.astype('category'))
      
      df.info()
      

      【讨论】:

        【解决方案3】:

        通常类别的顺序是有意义的,例如 t-short 尺寸“S”、“M”、“L”、“XL”是有序类别(在 SPSS - 序数中)。如果您有兴趣从字符串创建有序类别,可以使用以下代码:

        df = pd.concat([
                df.select_dtypes([], ['object']),
                df.select_dtypes(['object']).apply(pd.Categorical, ordered=True)
                ], axis=1).reindex(df.columns, axis=1)
        

        在生成的 DataFrame 中,分类列可以按值排序,就像您对字符串进行排序一样。

        【讨论】:

          【解决方案4】:

          applypd.Series.astypedtype='category' 一起使用

          考虑pd.DataFramedf

          df = pd.DataFrame(dict(
                  A=[1, 2, 3, 4],
                  B=list('abcd'),
                  C=[2, 3, 4, 5],
                  D=list('defg')
              ))
          df
          

          df.info()
          
          <class 'pandas.core.frame.DataFrame'>
          RangeIndex: 4 entries, 0 to 3
          Data columns (total 4 columns):
          A    4 non-null int64
          B    4 non-null object
          C    4 non-null int64
          D    4 non-null object
          dtypes: int64(2), object(2)
          memory usage: 200.0+ bytes
          

          让我们使用select_dtypes 包含所有'object' 类型以进行转换并与select_dtypes 重新组合以排除它们。

          df = pd.concat([
                  df.select_dtypes([], ['object']),
                  df.select_dtypes(['object']).apply(pd.Series.astype, dtype='category')
                  ], axis=1).reindex_axis(df.columns, axis=1)
          
          df.info()
          
          <class 'pandas.core.frame.DataFrame'>
          RangeIndex: 4 entries, 0 to 3
          Data columns (total 4 columns):
          A    4 non-null int64
          B    4 non-null category
          C    4 non-null int64
          D    4 non-null category
          dtypes: category(2), int64(2)
          memory usage: 208.0 bytes
          

          【讨论】:

          • 确实这是一个很好的开始。但我只想转换对象 dtype 而不是浮点数或整数,因为您的解决方案“蛮力”将任何内容转换为类别
          • 这个:df.select_dtypes(include=['object']).apply(pd.Series.astype, dtype='category').info() 部分有效,例如所有对象都被转换。但之后需要手动执行与数字列的合并。如何防止这种情况并有选择地更改 dtypes
          • 有没有更有效的方法?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-02
          • 2018-06-25
          • 1970-01-01
          • 2023-03-07
          • 2017-09-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多