如何将分类数据转换为索引并打印作业?

问题描述 投票:0回答:2

上下文 我有一个分类数据系列。我的目标是将其转换为上例中的索引。但是,还有另外两个要求:

  • nan 值应该保持 nan 而不是转换为索引,例如-1
  • 我想打印类别分配给索引

代码

red    -> 0
blue   -> 1
green  -> 2
nan    -> nan
red    -> 0
yellow -> 3
green  -> 2
nan    -> nan

series = series.astype('category').cat.codes

问题

我怎样才能实现这个目标?

python pandas machine-learning data-science categorical-data
2个回答
0
投票

如果您将其用于机器学习,请尝试 https://huggingface.co/docs/datasets/about_dataset_features

pip install datasets

用法:

import numpy as np
from datasets import ClassLabel


data = pd.Series(['red', 'blue', 'green', np.NaN, 'red', 'yellow', 'green', np.NaN])

# Convert NaN to string.
data = data.fillna('nan')

# Get unique classes.
unique_labels = list(set(data))

# Create the ClassLabel object.
mapper = ClassLabel(len(unique_labels), unique_labels)

# Apply the str2int mappings.
data.apply(mapper.str2int)

[出]:

0    3
1    2
2    1
3    0
4    3
5    4
6    1
7    0
dtype: int64

>>> mapper = ClassLabel(5, ['nan', 'green', 'blue', 'red', 'yellow'])
>>> mapper
ClassLabel(names=['nan', 'green', 'blue', 'red', 'yellow'], id=None)

0
投票

分类数据中使用的 -1 是为了提高效率,要么使用分类数据但不要弄乱内部结构,要么使用自定义顺序并映射您自己的值。

分类

您可以使用有序类别,因为代码将按顺序使用(第一个是 0,第二个是 1,等等),但是 NaN 将为 -1

df['col'] = pd.Categorical(df['col'], ordered=True,
                           categories=['red', 'blue', 'green', 'yellow'])

例子:

df = pd.DataFrame({'col': ['blue', 'red', 'yellow', np.nan]})

df['col'] = pd.Categorical(df['col'], ordered=True,
                           categories=['red', 'blue', 'green', 'yellow'])

print(df['col'].cat.codes)

输出:

0    1
1    0
2    3
3   -1
dtype: int8

自定义值

如果你真的需要 NaN 作为 NaN,那么

Categorical
是不合适的,而是使用
map

df['col'] = df['col'].map({'red': 0, 'blue': 1, 'green': 2, 'yellow': 3})
print(df)

或者,自动:

order = ['red', 'blue', 'green', 'yellow']

df['col'] = df['col'].map({k: v for v, k in enumerate(order)})

print(df)

输出:

   col
0  1.0
1  0.0
2  3.0
3  NaN
© www.soinside.com 2019 - 2024. All rights reserved.