Сначала вы можете разбить свои списки на несколько столбцов с помощью apply(pd.Series)
и join
, а затем - df_drug_ref
:
print (df_drug_ref.join(df_drug_ref['Drug_DIN_Id_Exclusion'].apply(pd.Series)))
Drug Drug_ATC_Id Drug_DIN_Id_Exclusion 0 1
0 A N123 [011235] 011235 NaN
1 B B5234 [65413, 654351] 65413 654351
2 C N32456 [] NaN NaN
Затем вы можете merge
в столбце 'Drug_ATC', к которому присоединились вышефрейм данных до People_Id
, после некоторой очистки столбцов:
df_merge = People_Id.merge(df_drug_ref[['Drug', 'Drug_ATC_Id']]
.join(df_drug_ref['Drug_DIN_Id_Exclusion']
.apply(pd.Series)
.add_prefix('Drug_DIN_'))
.rename(columns={'Drug_ATC_Id':'Drug_ATC'}),
how='left')
для получения df_merge
:
People_Id Drug_ATC Drug_DIN Drug Drug_DIN_0 Drug_DIN_1
0 1001 N123 A 011235 NaN
1 1001 N123 011235 A 011235 NaN
2 1001 N32456 011235 C NaN NaN
3 1001 N111 NaN NaN NaN
4 1002 B5234 65413 B 65413 654351
5 1002 B5234 654090 B 65413 654351
6 1002 N123 011235 A 011235 NaN
Теперь вы можете заменить столбец «Препарат» на NaN, гдезначение в «Drug_DIN» находится в одном из столбцов «Drug_DIN_i» с np.any
:
mask = np.any(df_merge.filter(like='Drug_DIN').iloc[:,:1].values ==
df_merge.filter(like='Drug_DIN').iloc[:,1:].values, axis=1)
df_merge.loc[mask,'Drug'] = np.nan
Наконец, для создания столбцов A, B, C ... вы можете использовать pd.get_dummies
с set_index
и затем reset_index
:
new_People_Id = pd.get_dummies(df_merge.set_index(['People_Id','Drug_ATC','Drug_DIN'])['Drug']).reset_index()
print (new_People_Id)
People_Id Drug_ATC Drug_DIN A B C
0 1001 N123 1 0 0
1 1001 N123 011235 0 0 0
2 1001 N32456 011235 0 0 1
3 1001 N111 0 0 0
4 1002 B5234 65413 0 0 0
5 1002 B5234 654090 0 1 0
6 1002 N123 011235 0 0 0
Обратите внимание, здесь также можно использовать join
, например:
new_People_Id = df_merge[['People_Id','Drug_ATC','Drug_DIN']].join(df_merge['Drug'].str.get_dummies())
возможно быстрее.