如何识别数据帧中的一键编码列

时间:2020-07-31 19:23:15

标签: python pandas numpy data-cleaning one-hot-encoding

在pandas数据帧中,存在多个具有二进制值的二进制特征列,而难题是要确定哪一列具有“一键标注/值”(哪一列可以是“一键编码”矢量的一部分)以及哪一列是一个独立功能,不是单编码标签/矢量的一部分。

我需要清理和预处理的数据看起来像这样:

Rows   v1  v2  v3  v4  v5  v6  v7  v8  v9  v10 Label

0      1   1   0   0   0   0   0   0   0   0     0
1      0   0   0   0   0   0   1   0   0   0     0
2      0   1   0   1   0   0   0   1   0.5 0     0
3      0   0   0   0   0   1   0   0   0   1     0
4      0   0   0   0   1   0   0   0   0   0     1
5      0   0   0   0   0   0   1   0   0   0     1
6      0   0   0   1   0   0   0   0   0   1     1
7      0   0   1   0   1   0   0   0   0.2 0     0
8      0   0   0   0   0   1   0   0   0   1     0

注意:需要找出特定的列组合,其中在行中有一个1和其他零,因为可能会有一些非hotEncoded /独立二进制列。

通过特定的列组合,其中我们在一行中有一个1和其他零,我的意思是这样的列的结果/最终组合,其中我们一行中有一个1(由排除其他二进制列):

v1  v4  v5  v6  v7

1   0   0   0   0  
0   0   0   0   1   
0   1   0   0   0   
0   0   0   1   0 
0   0   1   0   0 
0   0   0   0   1  
0   1   0   0   0  
0   0   1   0   0 
0   0   0   1   0  

2 个答案:

答案 0 :(得分:3)

您想要的东西似乎很难克服。我会提供指示。您需要最大数量的独立变量/因数。首先计算二进制变量的点积(df是您的数据框):

df = df[df.columns[~df.columns.isin(['Rows','Label','v9'])]]
df.v1.dot(df.v1)

     v1  v2  v3  v4  v5  v6  v7  v8  v10
v1    2   0   0   0   0   1   0   0    2
v2    0   2   0   1   0   0   0   1    0
v3    0   0   1   0   0   0   0   0    0
v4    0   1   0   2   0   0   0   1    1
v5    0   0   0   0   1   0   0   0    0
v6    1   0   0   0   0   1   0   0    1
v7    0   0   0   0   0   0   2   0    0
v8    0   1   0   1   0   0   0   1    0
v10   2   0   0   1   0   1   0   0    3

现在,您想要最大的子矩阵都为0且对称。如果对上述数据框(列的点积)进行二进制补充(将零转换为1,将非零转换为0),并从中创建一个图作为邻接矩阵,则您的问题将转化为寻找最大集团问题。据我所知,都是固定参数难解且难以估计。但是,如果变量的数量很少,则可以使用蛮力或近似算法找到它。

答案 1 :(得分:1)

我认为您可以根据dtypes来做到这一点:

print(df.columns[df.dtypes != 'float'])

Index(['Rows', 'v1', 'v2', 'v3', 'v4', 'v5', 'v6', 'v7', 'v8', 'v10', 'Label'], dtype='object')

您还可以基于计数(获取具有2个唯一值的列)

df.columns[df.apply(pd.Series.nunique) == 2]