将布尔列映射到另一列中的类别等价项



我有以下数据帧:

data = 
{'id': [1, 2, 3, 4, 5],
'A': [1, 0, 0, 0, 0],
'B': [0, 0, 1, 0, 0],
'C': [0, 0, 0, 0, 1],
'D': [0, 1, 0, 0, 0],
'E': [0, 0, 0, 1, 0]}
df = pd.DataFrame(data)

因此,我想创建一个新列,class,如果a为真(A=1(,它将接受0,如果B为真(B=1(,它会接受1,如果C为真,它会接收2,依此类推

预期输出:


id   A   B   C   D   E class
0   1   1   0   0   0   0   0
1   2   0   0   0   1   0   3
2   3   0   1   0   0   0   1
3   4   0   0   0   0   1   4
4   5   0   0   1   0   0   2

您可以使用np.nonzero,它返回一个元素索引为非零的元组,然后选择第二个元素。

df['class'] = np.nonzero(df.iloc[:,1:].to_numpy())[1]
print(df)
id  A  B  C  D  E  class
0   1  1  0  0  0  0      0
1   2  0  0  0  1  0      3
2   3  0  1  0  0  0      1
3   4  0  0  0  0  1      4
4   5  0  0  1  0  0      2

或者np.where,并且避免对df.to_numpy的需要。

np.where(df.iloc[:,1:].eq(1))[1]
df['class'] = df.apply(lambda x: x.B+x.C*2+x.D*3+x.E*4, axis=1)
print(df)

打印:

id  A  B  C  D  E  class
0   1  1  0  0  0  0      0
1   2  0  0  0  1  0      3
2   3  0  1  0  0  0      1
3   4  0  0  0  0  1      4
4   5  0  0  1  0  0      2

最新更新