从 15 个对象变量到最终目标变量(0 或 1)

From 15 object variables to final target variable (0 or 1)

我可以从 15 个对象变量变成一个最终二进制目标变量吗?

这 15 个变量有大约 10.000 个不同的代码,我的数据集大约有 21.000.000 条记录。我想做的是首先用 1 替换我想要的代码,将另一个替换为 0,然后如果 15 个变量中的一个是 1,则目标变量将为 1,如果所有 15 个变量均为 0,则目标变量将为 0。

我曾尝试使用 to_replace、as_type、to_numeric、infer_objects 但效果不佳,例如我的数据集看起来像这个头 (5) :

    D       P1    P2   P3    P4   P5   P6   P7   P8   P9   P10   P11   P12   P13   P14  P15
    41234   1234  4367 874   NAN  NAN  NAN  789  NAN  NAN  NAN   NAN   NAN   NAN   NAN  NAN 
    42345   7657  4367 874   NAN  NAN  NAN  789  NAN  NAN  NAN   NAN   NAN   NAN   NAN  NAN
    34212   7654  4347 474   NAN  NAN  NAN  789  NAN  NAN  NAN   NAN   NAN   NAN   NAN  NAN
    34212   8902  4317 374   NAN  452  NAN  719  NAN  NAN  NAN   NAN   NAN   NAN   NAN  NAN 
    19374   2564  4387 274   NAN  452  NAN  799  NAN  NAN  NAN   NAN   NAN   NAN   NAN  NAN

我想将所有 nan 转换为 0,并将选定代码转换为 1,因此所有 P1-P15 都将是二进制的,我将使用它们创建最终的 P 变量。

例如,如果 P1-P15 有“3578”、“9732”、“4734”...(我使用了大约 200 个代码)我想变成 1。 我想成为 0 的所有其他值。 D 变量应保持原样。 最终数据集将是 (D,P),然后我将添加火车变量

有什么想法吗?以下代码给出了错误的结果。

selCodes=['3722','66']
dfnew['P']=(dfnew.loc[:,'PR1':].astype(str).isin(selCodes).any(axis=1).astype(int))

看一下测试数据集(左)和新的 P(右)。示例代码 3722 P 应该是 1。

IIUC,使用,DataFrame.isin

# example select codes
selCodes = ['1234', '9732', '719']

df['P'] = (
    df.loc[:, 'P1':].astype(str)
    .isin(selCodes).any(axis=1).astype(int)
)

df = df[['D', 'P']]

结果:

       D  P
0  41234  1
1  42345  0
2  34212  0
3  34212  1
4  19374  0