在 Pandas 中制作有序虚拟列的更有效方法?
More Efficient Way to Make Ordinal Dummy Columns in Pandas?
你好,我正在做一个分类模型,将疾病的阶段作为分类变量。
以下是价值计数的示例:
- N0 - 720520
- NX-320115
- N1 - 234552
- N2 - 68529
- N3 - 48976
(注: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)
最终结果示例:
- 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]]
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
你好,我正在做一个分类模型,将疾病的阶段作为分类变量。 以下是价值计数的示例:
- N0 - 720520
- NX-320115
- N1 - 234552
- N2 - 68529
- N3 - 48976
(注: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)
最终结果示例:
- 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]]
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