referans ve başka df döngü sırasında Pandalar işlevini uygulamak kullanma?

oy
1

Adı verilen bir df gibi bir ilaç referans olması df_drug_ref(aşağıda). Üç ilaç (A, B, ve C) bulunmaktadır. Karşılık gelen ATC ikinci sütunda listelenir. Hasta içindeki bir DIN sahiptir, ancak Drug_BIN_Id_Exclusionliste, ardından s / o ilaç (ilaç A için, yani. 011.235) kullanılarak olarak kabul edilebilir değildir.

Drug        Drug_ATC_Id         Drug_DIN_Id_Exclusion
A           N123                [011235]
B           B5234               [65413, 654351]
C           N32456              []

Aşağıdaki diğer df denilen df_row olduğunu. Bu, her birey tarafından dağıtılacak tüm ilaçları yakalar. Ve her bireyin kendi vardır People_Id.

People_Id   Drug_ATC            Drug_DIN                A           B           C
1001        N123                                        
1001        N123                011235                  
1001        N32456              011232                  
1001        N111                                        
1002        B5234               65413                       
1002        B5234               654090                  
1002        N123                011235                  

Atadığımda istiyorum '1', ilgili ilaç için (A, B, veya C kontrol etmek için yinelemeli döngü ve karşılık gelen sütun atama) eğer arka arkaya, ATC kod ilaç referansla eşleşir ve DIN değildir dışlama listesinde içeriyordu. sonucu olmalıdır:

People_Id   Drug_ATC            Drug_DIN                A           B           C
1001        N123                                        1           0           0
1001        N123                011235                  0           0           0
1001        N32456              011232                  0           0           1
1001        N111                                        0           0           0
1002        B5234               65413                   0           0           0       
1002        B5234               654090                  0           1           0
1002        N123                011235                  0           0           0

Ben nasıl kullanılacağını anlamak applykendisi df aynı içinde fonksiyon, ama aynı zamanda referans olarak harici df nasıl kullanılacağını bilmiyorum.

Oluştur 27/11/2018 saat 18:15
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
1

Bu fonksiyon ve iterrows kullanarak bir çalışma çözümdür:

def check_rx_condition(row):
    for index, col in df_drug_ref.iterrows():
        if ((col['Drug_ATC_Id'] in row['Drug_ATC'])&
            (row['DRUG_DIN'] not in col['Drug_DIN_Id_Exclusion'])):
            row[col['Drug']] = 1
        else:
            row[col['Drug']] = 0
    return row

df_row = df_row.apply(check_rx_condition, axis=1)
Cevap 27/11/2018 saat 21:53
kaynak kullanıcı

oy
1

Önce birkaç sütunlara listelerinizi ayırabilirsiniz apply(pd.Series)ve joinbunları için 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

Sonra yapabilirsiniz mergesütununda 'Drug_ATC' yukarıda katıldı dataframe üzerinde etmek People_Id, sütunlar üzerinde biraz temizlik yaptıktan sonra:

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')

almak için 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

Şimdi 'Drug_DIN' değeri ile kolon'durumuna Drug_DIN_i 'birinde olduğunu NaN ile sütun 'İlacı' yerini alabilir 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

Son olarak, kullanabilirsiniz ... sütunları A, B, C oluşturmak için pd.get_dummiesbirlikte set_indexve daha sonra 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

Ayrıca kullanabilirsiniz burada Not joinörneğin:

new_People_Id = df_merge[['People_Id','Drug_ATC','Drug_DIN']].join(df_merge['Drug'].str.get_dummies())

belki daha hızlı.

Cevap 27/11/2018 saat 19:53
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more