我试图将分类值编码为虚拟向量。 pandas.get_dummies做得很好,但虚拟向量依赖于Dataframe中的值。如何根据与第一个Dataframe相同的虚拟向量对第二个Dataframe进行编码?
import pandas as pd
df=pd.DataFrame({'cat1':['A','N','K','P'],'cat2':['C','S','T','B']})
b=pd.get_dummies(df['cat1'],prefix='cat1').astype('int')
print(b)
cat1_A cat1_K cat1_N cat1_P
0 1 0 0 0
1 0 0 1 0
2 0 1 0 0
3 0 0 0 1
df_test=df=pd.DataFrame({'cat1':['A','N',],'cat2':['T','B']})
c=pd.get_dummies(df['cat1'],prefix='cat1').astype('int')
print(c)
cat1_A cat1_N
0 1 0
1 0 1
如何获得此输出?
cat1_A cat1_K cat1_N cat1_P
0 1 0 0 0
1 0 0 1 0
我正在考虑为每列手动计算唯一身份,然后创建一个字典来映射第二个Dataframe,但我确定已经有了一个函数... 谢谢!
答案 0 :(得分:4)
A始终使用categorical_encoding,因为它有很多编码器可供选择。它也可以很好地与Pandas一起使用,是pip可安装的,并且与sklearn API内联编写。这意味着您可以使用fit
和transform
方法或Pipeline
快速测试不同类型的编码器。
如果您希望仅对第一列进行编码,就像您的示例中一样,我们可以这样做。
import pandas as pd
import category_encoders as ce
df = pd.DataFrame({'cat1':['A','N','K','P'], 'cat2':['C','S','T','B']})
enc_ohe = ce.one_hot.OneHotEncoder(cols=['cat1'])
# cols=None, all string columns encoded
df_trans = enc_ohe.fit_transform(df)
print(df_trans)
cat1_0 cat1_1 cat1_2 cat1_3 cat2
0 0 1 0 0 C
1 0 0 0 1 S
2 1 0 0 0 T
3 0 0 1 0 B
默认情况下,列名称具有数字编码而不是原始字母。虽然您将长字符串作为类别,但这很有用。这可以通过传递use_cat_names=True
kwarg来改变,如Arthur所述。
现在我们可以使用transform
方法对您的第二个DataFrame进行编码。
df_test = pd.DataFrame({'cat1':['A','N',],'cat2':['T','B']})
df_test_trans = enc_ohe.transform(df_test)
print(df_test_trans)
cat1_1 cat1_3 cat2
0 1 0 T
1 0 1 B
如第5行所述,未设置cols
默认值来编码所有字符串列。
答案 1 :(得分:1)
之前我遇到过同样的问题。这就是我所做的,这不是最好的方法。但这对我有用。
df=pd.DataFrame({'cat1':['A','N'],'cat2':['C','S']})
df['cat1'] = df['cat1'].astype('category', categories=['A','N','K','P'])
# then run the get_dummies
b=pd.get_dummies(df['cat1'],prefix='cat1').astype('int')
将函数astype用于'类别'值作为参数传入。
要将同一类别应用于所有DF,最好将类别值存储到类似
的变量中cat1_categories = ['A','N','K','P']
cat2_categories = ['C','S','T','B']
然后使用类似
的astypedf_test=df=pd.DataFrame({'cat1':['A','N',],'cat2':['T','B']})
df['cat1'] = df['cat1'].astype('category', categories=cat1_categories)
c=pd.get_dummies(df['cat1'],prefix='cat1').astype('int')
print(c)
cat1_A cat1_N cat1_K cat1_P
0 1 0 0 0
1 0 1 0 0