如何识别数据框中的单热编码列
How to recognize one-hot encoded columns in data frame
在pandas数据框中有多个二进制值的二进制特征列,挑战是识别哪一列具有单热labels/values(哪一列可以是单热的一部分-hot 编码向量)以及哪一列是一个独立的特征而不是 one-hot 编码的一部分 labels/vector.
我需要以某种方式清理和预处理的数据如下所示:
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 和其他零,因为可以有一些 non-hotEncoded/independent 个二进制列。
特定的列组合,其中我们在一行中有一个 1 和其他零,我的意思是像这样的 result/final 列组合,我们有一行中的一个 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
我认为你可以根据 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]
你想要的似乎很难克服。我会提供方向。您想要最大数量的 variables/factors 是独立的。您首先计算二进制变量的点积(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)并从中创建一个图形作为邻接矩阵,您的问题将转化为寻找最大团问题。据我所知,既难以处理又难以近似的固定参数。但是,如果变量的数量很少,您可能可以使用暴力或近似算法找到它。
在pandas数据框中有多个二进制值的二进制特征列,挑战是识别哪一列具有单热labels/values(哪一列可以是单热的一部分-hot 编码向量)以及哪一列是一个独立的特征而不是 one-hot 编码的一部分 labels/vector.
我需要以某种方式清理和预处理的数据如下所示:
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 和其他零,因为可以有一些 non-hotEncoded/independent 个二进制列。
特定的列组合,其中我们在一行中有一个 1 和其他零,我的意思是像这样的 result/final 列组合,我们有一行中的一个 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
我认为你可以根据 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]
你想要的似乎很难克服。我会提供方向。您想要最大数量的 variables/factors 是独立的。您首先计算二进制变量的点积(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)并从中创建一个图形作为邻接矩阵,您的问题将转化为寻找最大团问题。据我所知,既难以处理又难以近似的固定参数。但是,如果变量的数量很少,您可能可以使用暴力或近似算法找到它。