Python 在Pandas中创建序号伪列的更有效方法?

Python 在Pandas中创建序号伪列的更有效方法?,python,pandas,dummy-variable,Python,Pandas,Dummy Variable,你好,我正在做一个分类模型,将疾病的阶段作为分类变量。 下面是一个值计数的示例: N0-720520 NX-320115 N1-234552 N2-68529 N3-48976 (注:NX表示未测量) 我正在制作stages虚拟变量,以便将当前和以前传递的stages设置为1 我的问题是,我为此创建的代码是否可以编写得更好。首先,我用函数设置每列的值 def N1(row): if row['N'] == 'N1': return 1 if row['N']

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

  • N0-720520
  • NX-320115
  • N1-234552
  • N2-68529
  • N3-48976
(注:NX表示未测量)

我正在制作stages虚拟变量,以便将当前和以前传递的stages设置为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)
最后结果的一个例子:

  • NX:0
  • N3:0
  • N2:1
  • N1: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]]


创建所有列的虚拟对象并删除
'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]]


类似于
pd.get\u dummies(df['N'])
?类似于
pd.get\u dummies(df['N'])