1

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

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

我曾尝试使用 to_replace、as_type、to_numeric、infer_objects,但效果不佳,例如我的数据集看起来像这样的 head(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。

测试数据集 新的 P-3722 在 selCodes 中,所以 P 应该是 1

4

1 回答 1

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
于 2020-06-03T15:00:50.413 回答