Skip to main content
 首页 » 编程设计

python之如何根据相同的虚拟向量对两个 Pandas 数据帧进行编码

2025年05月04日26zdz8207

我正在尝试将分类值编码为虚拟向量。 pandas.get_dummies 做得很完美,但虚拟向量取决于数据框中存在的值。如何根据与第一个数据帧相同的虚拟向量对第二个数据帧进行编码?

 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,但我确信已经有一个函数可以做到这一点...... 谢谢!

请您参考如下方法:

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 默认情况下对所有字符串列进行编码。