上下文 我有一个分类数据系列。我的目标是将其转换为上例中的索引。但是,还有另外两个要求:
代码
red -> 0
blue -> 1
green -> 2
nan -> nan
red -> 0
yellow -> 3
green -> 2
nan -> nan
series = series.astype('category').cat.codes
问题
我怎样才能实现这个目标?
如果您将其用于机器学习,请尝试 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)
分类数据中使用的 -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