python - Pandas分类数据: Storing the transformation

标签 python pandas dictionary categorical-data

假设我有以下数据框。

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)

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

关于python - Pandas分类数据: Storing the transformation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51085875/

相关文章:

ios - UILocalNotification 用户信息中的 Swift 字典

python - 获取两个字典中(几乎)匹配的键的值并将它们连接起来

python - 如何填充 Pyplot 线图并根据值更改填充

python - 重复类实例化和赋值的紧凑形式

python - Flask API 无法解码 JSON 数据。错误: "message": "Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)"

python - 如果任何其他列满足特定条件,如何将整个组放入 pandas 中?

python - 如何获取字典元组的最大值

python - 返回句子中的第一个单词?

python - 当作为参数传递时,如何跨多个自定义函数处理 Pandas DataFrame?

python - 保留列名的最后 2 个元素,用管道分隔 python pandas