gpt4 book ai didi

python - 无法优化此代码,想知道为什么它运行得也这么慢 - 我该如何优化此代码?

转载 作者:行者123 更新时间:2023-11-28 20:56:05 24 4
gpt4 key购买 nike

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

并发症类由一个“名称”组成,它是并发症的名称,例如“HeartFailure”,它还有一个存储为“代码”的字符串数组,其值例如“500”,它需要匹配每个患者的 18 列(最终的每一行)并查找代码,例如“5001”或“5002”。如果找到代码,则需要将数据集中相应的并发症列更新为 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

最佳答案

有两件事正在减慢您的代码速度:

  1. 使用两个for循环
  2. .apply 与您自己定义的函数结合使用。

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

  1. np.where
  2. np.stack_columns
  3. pandas.DataFrame.iloc

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

# 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_updatestrings_to_search 传输到函数的参数,这使得它更简洁,我现在选择不这样做是为了简单。

关于python - 无法优化此代码,想知道为什么它运行得也这么慢 - 我该如何优化此代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55212992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com