比较两个值,如果匹配则将它们添加到列表中 - 代码改进
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 秒,比以前好多了。
我正在处理病史数据,需要找出患者的一系列诊断结果。 我有一个大型数据库,其中包含有关唯一 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 秒,比以前好多了。