我在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‘的新列,如果三个列(常规病房、半集中、集中)为0,则包含1,否则返回0。
之后,我将每列中的值映射到一列中,以返回列的名称,而不是0或1。
Patient ID, Admission type
1 No admission
2 Regular ward
3 Semi-intensive
4 Semi-intensive
5 Intensive
并为No admission=0,Regular ward=1,Semi-intensive=2,Intensive=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分钟!
我知道这是一个改善它的更好的方法,我很感谢任何人的帮助。
发布于 2020-04-01 10:23:33
使用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
发布于 2020-04-01 10:15:41
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切片的一部分,它应该仍然可以工作。
发布于 2020-04-01 10:10:38
您可以使用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
https://stackoverflow.com/questions/60962461
复制相似问题