我的一行数据有18列,每列都有一个复杂代码。
complication类由一个“名称”组成,该名称是诸如“ HeartFailure”之类的复杂名称,并且它还具有存储为“ codes”的字符串数组,其字符串值例如为“ 500”,因此需要在每个患者的18列中进行匹配(最后一行的每一行),并找到诸如“ 5001”或“ 5002”之类的代码。如果找到了代码,则需要将数据集中相应的并发症列更新为1。
这是我编写的解决方案。您认为这可能会更优化吗?目前,仅25,000名患者就需要大约16分钟的时间,这还不够好。
数据:
DX1 DX2 DX3 DX4 HeartFailure
10R46 R*1005 8017 2 0
10R46 R*10335 5019 2 0
100R91 R*1005 8017 1 0
10R91 R*243 8870 1 0
10M95 R*4918 8305 3 0
10M95 R*9017 8305 3 0
10M95 R*9470 8221 3 0
班级:
class HCUPCodes:
def __init__(self,name,codes):
self.name = name
self.codes = codes
类的初始化:
complications_POA = []
complications_POA.append(HCUPCodes('HeartFailure',['80', 'R*1']))
代码:
def defineComplicationsFeatures(patient, comp_list):
for i in range(len(comp_list)):
for x in comp_list[i].codes:
if((any(patient.str.startswith(x,na=False)))):
patient[comp_list[i].name]=1 #change 0 to 1 in the corresponding disease column for this patient
return patient
final = final.apply(defineComplicationsFeatures, axis=1, comp_list = complications_POA)
final = final.apply(defineComplicationsFeatures, axis=1, comp_list = complications_NOPOA)
输出:
DX1 DX2 DX3 DX4 HeartFailure
10R46 R*1005 8017 2 1
10R46 R*10335 5019 2 1
100R91 R*1005 8017 1 1
10R91 R*243 8870 1 0
10M95 R*4918 8305 3 0
10M95 R*9017 8305 3 0
10M95 R*9470 8221 3 0
答案 0 :(得分:3)
要实现最低速度,您可以在找到代码后添加Map
:
break
答案 1 :(得分:3)
有两件事使您的代码速度变慢:
.apply
与您自己定义的函数一起使用。您可以使用pandas
和numpys
的向量化方法来优化您的解决方案:
解决方案:(在这种情况下,我没有使用您的课程)
# Print the DataFrame we start with provided by OP
print(df)
DX1 DX2 DX3 DX4 HeartFailure
0 10R46 R*1005 8017 2 0
1 10R46 R*10335 5019 2 0
2 100R91 R*1005 8017 1 0
3 10R91 R*243 8870 1 0
4 10M95 R*4918 8305 3 0
5 10M95 R*9017 8305 3 0
6 10M95 R*9470 8221 3 0
# Create new optimized function
def defineComplicationsFeatures(df):
col_to_update = 'HeartFailure'
strings_to_search = ['80', 'R*1']
for string in strings_to_search:
mask = np.column_stack([df[col].str.startswith(string, na=False) for col in df.iloc[:, :-1]]).any(axis=1)
df[col_to_update] = np.where(mask, 1, 0)
return df
df_new = defineComplicationsFeatures(df)
print(df_new)
DX1 DX2 DX3 DX4 HeartFailure
0 10R46 R*1005 8017 2 1
1 10R46 R*10335 5019 2 1
2 100R91 R*1005 8017 1 1
3 10R91 R*243 8870 1 0
4 10M95 R*4918 8305 3 0
5 10M95 R*9017 8305 3 0
6 10M95 R*9470 8221 3 0
注意
您可以将col_to_update
和strings_to_search
传递到该函数的参数,这会使它更简洁一些,我现在为了简单起见选择不这样做。