Вы можете присоединиться к двум коллекциям в Монго, используя поиск, который предлагается в версии 3.2. В вашем случае запрос будет
db.comments.aggregate({
$lookup:{
from:"users",
localField:"uid",
foreignField:"uid",
as:"users_comments"
}
})
, или вы также можете присоединиться к пользователям, тогда будет небольшое изменение, как указано ниже.
db.users.aggregate({
$lookup:{
from:"comments",
localField:"uid",
foreignField:"uid",
as:"users_comments"
}
})
Он будет работать так же, как левое и правое соединение в SQL.
Для достижения минимального ускорения вы можете добавить 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
Две вещи замедляют ваш код:
.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
& amp; strings_to_search
к аргументам функции, которая делает его немного чище, я выбрал не для простоты прямо сейчас.