我希望能够根据另一个数据帧的级别对数据帧进行一次热编码。 例如,在下面的示例中,数据提供了两个变量的级别。仅基于这些级别,我想在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)
答案 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
如有必要,您可以进行排序。