在 Pandas 中制作有序虚拟列的更有效方法?

More Efficient Way to Make Ordinal Dummy Columns in Pandas?

你好,我正在做一个分类模型,将疾病的阶段作为分类变量。 以下是价值计数的示例:

(注:NX表示未测量)

我正在制作阶段虚拟变量,以便当前和之前通过的阶段都将设置为 1。

我的问题是我为此创建的代码是否可以编写得更好。首先,我使用函数设置每一列的值。

def N1(row):
    if row['N'] == 'N1':
        return 1
    if row['N'] == 'N2' :
        return 1 
    if row['N'] == 'N3' :
        return 1    
    else:
        return 0

def N2(row):
    if row['N'] == 'N2' :
        return 1 
    if row['N'] == 'N3' :
        return 1    
    else:
        return 0

def N3(row):
    if row['N'] == 'N3' :
        return 1    
    else:
        return 0
    
def NX(row):
    if row['N'] == 'NX' :
        return 1    
    else:
        return 0

然后将这些函数用于:

df['N1'] = df.apply (lambda row: N1(row), axis =1)
df['N2'] = df.apply (lambda row: N2(row), axis =1)
df['N3'] = df.apply (lambda row: N3(row), axis =1)
df['NX'] = df.apply (lambda row: NX(row), axis =1)

最终结果示例:

欢迎任何有关此过程如何减少代码的输入!谢谢。

创建所有列的虚拟对象并删除 'N0',因为您不关心那个。如果较高阶段为 1,则应用层次结构将较低阶段设置为 1。

import pandas as pd
df = pd.DataFrame({'N': ['N0', 'N1', 'NX', 'N2', 'N3']}) 

df = pd.concat([df, pd.get_dummies(df['N']).drop(columns='N0')], axis=1)

hierarchy = ['N3', 'N2', 'N1']
for i in range(len(hierarchy)-1):
    df[hierarchy[i+1]] += df[hierarchy[i]]

    N  N1  N2  N3  NX
0  N0   0   0   0   0
1  N1   1   0   0   0
2  NX   0   0   0   1
3  N2   1   1   0   0
4  N3   1   1   1   0