在python中优化标签编码的时间迭代

2024-09-28 18:55:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python的数据框架中有以下列,名为admission:

Patient ID, Regular ward, Semi-intensive, Intensive
1                0               0            0
2                1               0            0
3                0               1            0
4                0               1            0
5                0               0            1

我已经完成了以下转换:

 Patient ID, Admission type
 1                 0
 2                 1
 3                 2
 4                 2
 5                 3

基本上,为了实现这一转换,我创建了一个名为“No admission”的新列,其中包含1,如果三个列(常规病房、半强化病房、强化病房)为0,则返回0

之后,我将每列中的值映射到一列中,以返回列的名称,而不是0或1

Patient ID, Admission type
 1          No admission
 2          Regular ward
 3          Semi-intensive
 4          Semi-intensive
 5          Intensive

对于不入院=0,普通病房=1,半强化病房=2,强化病房=3,再次进行映射

下面是我的完整代码转换

df['No admission'] = None
admission= df.iloc[:,3:6] # Selecting only the three columns mentioned above.

for row in df.index:
    if admission.apply(any,axis=1).values[row]:
        df.loc[row,'No admission'] = 0
    else:
        df.loc[row,'No admission'] = 1

cols = [4,5,6,106]
df.insert(loc = 1,
          column = 'Admission type',
          value = df.iloc[:,cols].apply(np.argmax, axis=1))

df.drop(df.columns[cols],axis=1,inplace=True)

le = LabelEncoder()
le.fit(df['Admission type'])
df['Admission type'] = le.transform(df['Admission type'])

关键是:我的原始数据集有5644行和111列。解释上述内容的执行时间大约为10分钟

我知道这是一个更好的方法来改善它,我感谢任何帮助


Tags: noleiddftypelocrowcols
3条回答
admission_copy = admission.copy()
admission_copy["Semi-intensive"] = admission_copy["Semi-intensive"]*2
admission_copy["Intensive"] = admission_copy["Intensive"]*3
df["Admission type"] = admission_copy.sum(axis=1)

这是假设没有患者有两种入院类型。如果创建此列只需要常规列、半列和密集列,则不必复制df,只需直接更改df即可

编辑:另外,我假设“patient”是索引列。如果它是自己的专栏,只需不将其作为“准入”df切片的一部分,它仍然可以工作

您可以使用dot将列名合并到每个1中,并从中创建一个新的数据帧

df1 = df[['Regular-ward', 'Semi-intensive', 'Intensive']]
df_final = df[['Patient_ID']].assign(**{'Admission Type': df1.dot(df1.columns).replace('', 'No admission')})

Out[16]:
   Patient_ID  Admission Type
0           1   No admission
1           2    Regular-ward
2           3  Semi-intensive
3           4  Semi-intensive
4           5       Intensive

使用np.where()如何提高性能?我想会快得多

输入:

Patient ID  Regular ward   Semi-intensive  Intensive
1                0               0            0
2                1               0            0
3                0               1            0
4                0               1            0
5                0               0            1

代码:

df=pd.read_clipboard(sep='\\s\\s+'))
df['Admission type'] = ''
df['Admission type'] = np.where(df['Regular ward'] == 1, 'Regular ward', df['Admission type'])
df['Admission type'] = np.where(df['Semi-intensive'] == 1, 'Semi-intensive', df['Admission type'])
df['Admission type'] = np.where(df['Intensive'] == 1, 'Intensive', df['Admission type'])
df['Admission type'] = np.where((df['Regular ward'] + df['Semi-intensive'] + df['Intensive'] == 0),
                              'No admission', df['Admission type'])
df=df[['Patient ID', 'Admission type']]
df 

输出:

    Patient ID   Admission type
0   1          No admission
1   2          Regular ward
2   3          Semi-intensive
3   4          Semi-intensive
4   5          Intensive

相关问题 更多 >