python - Pandas 分类数据:存储转换
问题描述
假设我有以下数据框。
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
缺少所有分类信息。我可以将类别到整数的映射保存在文件中吗?我希望能够在将来以编程方式反转数据帧上的转换。
编辑:我正在寻找一个可逆的过程。这意味着将所有分类列的转换保存在实际文件中。在未来的某个时间,我想获取我拥有的任何结果,其中列仍将与原始数据框具有相同的名称,使用保存的信息进行逆变换,并根据分类数据获得结果。
解决方案
您可以使用几个嵌套的字典推导来存储所有类别列的双向映射。如果您需要将这些存储在外部,您可以使用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 个单独的映射。
推荐阅读
- ms-word - 未在 Word 中设置 OpenXml 标头设置
- java - Spring Boot 中的时间调度
- javascript - 我创建了一个对象,但是当被调用时,它说未定义(JavaScript)
- android - 为什么计数器变量的值在屏幕上没有变化?
- mqtt - Paho 客户在 Mosquitto Broker 上断开连接
- android - Android Google-signin get Api Exception 10: in Playstore APK
- sql-server - 使用 min 和 cast nvarchar 与 group by 一起浮动会在转换中引发错误
- python - 如何优化预处理所有文本文档而不使用 for 循环在每次迭代中预处理单个文本文档?
- c# - 禁用对角线移动
- go - Intellij 在项目中找不到模块