越短越好:
import pandas as pd
cats = pd.Index(['a', 'b', 'c'])
df = pd.DataFrame({'cat': ['a', 'b', 'a']})
pd.get_dummies(df, prefix='', prefix_sep='').reindex(columns = cats, fill_value=0)
结果:
a b c
0 1 0 0
1 0 1 0
2 1 0 0
笔记:
cats
需要是熊猫索引
prefix=''
并且prefix_sep=''
需要设置才能使用您首先定义的猫类别。否则,get_dummies
转换为:cats_a
和cats_b
) cats_c
。对我来说这更好,因为它是明确的。
- 使用 fill_value=0 转换
NaN
from 列c
。或者,您可以fillna(0)
在句末使用。(我不知道哪个更快)。
这是一个更短的版本(更改了索引值):
import pandas as pd
cats = pd.Index(['cat_a', 'cat_b', 'cat_c'])
df = pd.DataFrame({'cat': ['a', 'b', 'a']})
pd.get_dummies(df).reindex(columns = cats, fill_value=0)
结果:
cat_a cat_b cat_c
0 1 0 0
1 0 1 0
2 1 0 0
奖金轨道!
我想你有这些类别,因为你以前使用训练数据做了一个虚拟/一个热门。您可以保存原始编码(.columns
),然后在生产期间应用:
cats = pd.Index(['cat_a', 'cat_b', 'cat_c']) # it might come from the original onehot encoding (df_ohe.columns)
import pickle
with open('cats.pickle', 'wb') as handle:
pickle.dump(cats, handle, protocol=pickle.HIGHEST_PROTOCOL)
with open('cats.pickle', 'rb') as handle:
saved_cats = pickle.load(handle)
df = pd.DataFrame({'cat': ['a', 'b', 'a']})
pd.get_dummies(df).reindex(columns = saved_cats, fill_value=0)
结果:
cat_a cat_b cat_c
0 1 0 0
1 0 1 0
2 1 0 0