繁体   English   中英

如何根据相同的伪向量对两个熊猫数据帧进行编码?

[英]How to encode two Pandas dataframes according to the same dummy vectors?

我正在尝试将分类值编码为虚拟向量。 pandas.get_dummies做得很好,但是伪向量取决于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,但是我确定已经有一个函数了……谢谢!

始终使用categorical_encoding,因为它有很多编码器选择。 它也可以很好地与Pandas配合使用,可pip安装,并使用sklearn API内联编写。 这意味着您可以使用fittransform方法或在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

默认设置是使列名具有数字编码,而不是原始字母。 尽管当您将长字符串作为类别时,这很有用。 如Arthur所述,可以通过传递use_cat_names=True kwarg来更改此设置。

现在我们可以使用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默认为对所有字符串列进行编码。

我之前也遇到过同样的问题。 这是我所做的,但这并不是最好的方法。 但这对我有用。

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']

然后使用astype

df_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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM