比较两个值,如果匹配则将它们添加到列表中 - 代码改进

Compare two values and add them to list if they match - code improvement

我正在处理病史数据,需要找出患者的一系列诊断结果。 我有一个大型数据库,其中包含有关唯一 ID、诊断、与医疗保健联系时间等方面的数据。

我在这里做了一些虚拟数据来说明:

import pandas as pd
import numpy as np

columns = ["ID","DIAG","TYPE","IN","OUT","GENDER","DOB"]
diags = pd.DataFrame(np.random.randint(0,100,size=(2000,7)),columns=columns)
diags_counter = diags.groupby("ID")["DIAG"].count().to_frame()
diags_counter.reset_index(level=0,inplace=True)

我重新设置了索引,因为数据库中的 ID 比较复杂,使用 .loc 是行不通的。

我的想法是为每个患者制作一个列表或数据框列表的字典,即一个患者可能只有一个诊断,而另一个可能有 2 个或更多。 以下代码有效,但速度极慢,而且由于我有超过 50 万患者,这行不通:

diags_seq = []
for i in range(0,len(diags_counter)):
  X= []
  for j in range(0,len(diags)):
    if diags_counter.ID.iloc[i] == diags.ID.iloc[j]:
      X.append(diags.iloc[j])
  diags_seq.append(X)
  print(f"\r{i+1} of {len(diags_counter)} found", end="")

对于如何解决这个问题的任何帮助,我们将不胜感激:)

我觉得这会没问题:

unique_id = diags.ID.unique()
dict_of_specifics_id = {}
for id in unique_id:
   dict_of_specifics_id[id] = {}
   dict_of_specifics_id[id]['id_counter'] = 0
   dict_of_specifics_id[id]['diag_list'] = []
for index, row in diags.iterrows():
   dict_of_specifics_id[row.ID]['id_counter']+=1
   dict_of_specifics_id[row.ID]['diag_list'].append(row.DIAG)
dict_of_specifics_id   

输出:

{21: {'id_counter': 16,
  'diag_list': [45, 41, 92, 91, 62, 54, 16, 18, 23, 18, 0, 47, 9, 45, 2, 61]},

其中21是ID,diag_list是对该ID的诊断列表。 id_counter 实际上是 diag_list 的长度。

所以经过一些调整,我最终使用了以下内容:

dict_of_specifics_id = {}
for id in unique_id:
   dict_of_specifics_id[id] = {}
   dict_of_specifics_id[id]['diag_list'] = []
for index, row in diags.iterrows():
   dict_of_specifics_id[row.ID]['diag_list'].append(row)

seq_diags_list = list(dict_of_specifics_id.values())

seq_diags = []
for i in range(0,len(seq_diags_list):
   X = list(seq_diags_list[i].values())
   df = pd.concat(X[0],axis=1).T
   seq_diags.append(df)

这最终会给出一个数据帧列表,其中每个数据帧的长度表示为与每个 patient/id 相关联的诊断数量。

PS:大约 600,000 个数据点 运行 大约需要 10 秒,比以前好多了。