优化这段代码有困难,不知道为什么它运行太慢,我怎么能优化这段代码?

2024-05-15 09:03:27 发布

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

我的一行数据有18列,每列都有一个复杂的代码。你知道吗

并发症类由“name”组成,name是并发症的名称,如“HeartFailure”,它还有一个字符串数组,存储为“codes”,其值为“500”,需要为每个患者(final的每一行)匹配18列,并查找代码,如“5001”或“5002”。如果找到了代码,则需要将数据集中相应的complexity列更新为1。你知道吗

这就是我编写的解决方案。你认为这可以更优化吗?目前,仅在25000名患者身上运行大约需要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

Tags: 数据代码nameinselfforcodeslist
2条回答

要获得最低的速度,可以在找到代码后添加break

 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 
                break
    return patient

有两件事让你的代码慢了下来:

  1. 使用两个for循环
  2. .apply与自己定义的函数一起使用。你知道吗

您可以使用pandasnumpys的矢量化方法优化您的解决方案:

  1. ^{}
  2. ^{}
  3. ^{}

解决方案:(在这种情况下我没有使用你的类)

# 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转换为函数的参数,这使函数更简洁,为了简单起见,我现在选择不这样做。你知道吗

相关问题 更多 >