【问题标题】:Pandas categorical data: Storing the transformationPandas 分类数据:存储转换
【发布时间】:2018-12-07 17:06:10
【问题描述】:

假设我有以下数据框。

df = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),  'col3':list('ababb')})

我可以通过执行以下操作将分类数据转换为整数。

df['col2'] = df['col2'].astype('category')
df['col3'] = df['col3'].astype('category')
cat_columns = df.select_dtypes(['category']).columns
df[cat_columns] = df[cat_columns].apply(lambda x: x.cat.codes)

当我执行 print(df.dtypes) 时,这个转换结束时,我得到了

col1    int64
col2     int8
col3     int8

缺少所有分类信息。我可以将类别到整数的映射保存在文件中吗?我希望将来能够以编程方式反转数据帧上的转换。

编辑:我正在寻找一个可逆的过程。这意味着将所有分类列的转换保存在实际文件中。在未来的某个时间,我想获取我拥有的任何结果,其中列仍将与原始数据帧具有相同的名称,使用保存的信息进行逆变换,并根据分类数据获取结果。

【问题讨论】:

  • 您在申请获取代码时删除了类别dtype。
  • 在执行 cat.codes 之前如何保存它?在删除类别 dtype 之前,我愿意插入一个额外的操作。我只想要一个可逆的过程。
  • 这种转变的目的是什么——这是机器学习的一部分吗?
  • @KRKirov,这是一种可能的用途。
  • 大多数机器学习算法不直接处理分类编码的数据,而是处理 one-hot 编码的数据。标签编码通常仅用于对 y 数据进行编码

标签: python pandas dictionary categorical-data


【解决方案1】:

您可以使用几个嵌套的字典推导来存储所有类别列的双向映射。如果需要在外部存储这些,可以使用pickle

cat_cols = df.select_dtypes(['category']).columns

cat_to_code = {col: dict(zip(df[col], df[col].cat.codes)) \
               for col in cat_cols}
# {'col2': {'a': 0, 'b': 1, 'c': 2}, 'col3': {'a': 0, 'b': 1}}

code_to_cat = {k: {v2: k2 for k2, v2 in v.items()} \
               for k, v in cat_to_code.items()}
# {'col2': {0: 'a', 1: 'b', 2: 'c'}, 'col3': {0: 'a', 1: 'b'}}

df[cat_cols] = df[cat_cols].apply(lambda x: x.cat.codes)

请注意,2 路单射映射本身是不可能的,如果您需要在两个方向上进行 O(1) 访问,则必须维护 2 个单独的映射。

【讨论】:

  • cat_to_code 存在问题。如果是'col2':list('aabca'),你会发现这是错误的。 cat.codes 给出了翻译后的列 (length=5),但 cat.categories 只给出了唯一的类别,length=3。
  • @Spinor8, Woops, enumerate 应该可以代替,已更新。
  • 我们是否总是保证代码是从枚举生成的?我们对映射 cat_to_code 使用 enumerate,但我们使用的实际映射是 cat.codes。我只是担心有一天 Pandas 可能会决定从 1 而不是 0 进行枚举,而我们所有这些代码都是从零开始的。
  • 我没有看到它记录在案。但这是被赞成的解决方案here 并且具有理论上的意义。
  • 我认为更安全的选择可能是使用这样的东西代替最后一行。对于 cat_cols 中的 col:df[col].map(code_to_cat[col])。这样你就不会假设任何事情。您正在使用自己生成的所有映射。
猜你喜欢
  • 1970-01-01
  • 2019-05-02
  • 2016-08-01
  • 1970-01-01
  • 2015-11-30
  • 2017-02-03
  • 2019-11-30
  • 2017-02-18
  • 2021-03-23
相关资源
最近更新 更多