我有以下数据帧:
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