来自其他数据框级别的虚拟变量

时间:2013-07-28 02:49:55

标签: python pandas

我希望能够根据另一个数据帧的级别对数​​据帧进行一次热编码。 例如,在下面的示例中,数据提供了两个变量的级别。仅基于这些级别,我想在data2中创建虚拟变量。

我该如何解决这个问题?

import pandas as pd

#unique levels (A,B for VAR1, and X,Y,Z for VAR2) in
#this dataset determine the possible levels for the following dataset
data = {'VAR1': ['A', 'A', 'A', 'A','B', 'B'],

'VAR2': ['X', 'Y', 'Y', 'Y','X', 'Z']}

frame = pd.DataFrame(data)

#data2 contains same variables as data, but might or might not
#contain same levels

data2 = {'VAR1': ['A', 'C'],

'VAR2': ['X', 'Y']}

frame2 = pd.DataFrame(data2) 

#after applying one hot encoding to data2, this is what it should look like

data_final = {
'A': ['1', '0'],
'B': ['0', '0'],
'X': ['1', '0'],
'Y': ['0', '1'],
'Z': ['0', '0'],
}

frame_final = pd.DataFrame(data_final)

1 个答案:

答案 0 :(得分:1)

可能有很多方法可以实现这一目标。无论出于何种原因,我都采用了这种方法:

In [74]: part = pd.concat([pd.get_dummies(frame2[x]) for x in frame2], axis=1)

In [75]: part
Out[75]: 
   A  C  X  Y
0  1  0  1  0
1  0  1  0  1

你可以看到我们已经差不多了,唯一缺少的是frame2,B和Z中没有显示的那些列。再次有多种方法可以添加这些(I'我很想知道你认为哪个更合适,但我想使用reindex_axis方法。要使用它,我们需要另一个包含所有可能值的索引。

In [76]: idx = pd.Index(np.ravel(frame.values)).unique()

In [77]: idx
Out[77]: array(['A', 'X', 'Y', 'B', 'Z'], dtype=object)

最后使用0:

重新索引并填充NaN s
In [78]: part.reindex_axis(idx, axis=1).fillna(0)
Out[78]: 
   A  X  Y  B  Z
0  1  1  0  0  0
1  0  0  1  0  0

如有必要,您可以进行排序。