Terapkan fungsi Python ke satu kolom pandas dan terapkan hasilnya ke beberapa kolom

Aug 20 2020

Halo Komunitas,

Saya telah membaca begitu banyak jawaban dan blog namun saya tidak dapat menemukan hal sederhana apa yang saya lewatkan !. Saya menggunakan fungsi 'kondisi' untuk menentukan semua kondisi dan menerapkannya ke satu kolom kerangka data. Dan jika kondisinya memuaskan, maka harus membuat / memperbarui 2 kolom dataframe baru 'cat' dan 'subcat'.

Akan sangat membantu jika kalian bisa membantu saya di sini!

dict = {'remark':['NA','NA','Category1','Category2','Category3'],
        'desc':['Present','Present','NA','Present','NA']
} 

df = pd.DataFrame(dict) 

Dataframe terlihat seperti ini:

          remark       desc
0         NA           Present      
1         NA           Present        
2         Category1    NA                   
3         Category2    Present                   
4         Category3    NA            

Saya telah menulis fungsi untuk mendefinisikan kondisi seperti di bawah ini:

def conditions(s):

    if (s == 'Category1'):
        x = 'insufficient'
        y = 'resolution'
    elif (s=='Category2):
        x= 'insufficient'
        y= 'information'
    elif (s=='Category3):
        x= 'Duplicate'
        y= 'ID repeated'
    else:
        x= 'NA'
        y= 'NA'
    
    return (x,y)

Saya punya banyak ide untuk menjalankan fungsi di atas pada kolom dataframe tetapi tidak berhasil.

df[['cat','subcat']] = df['remark'].apply(lambda x: pd.Series([conditions(df)[0],conditions(df)[1]]))

Dataframe yang saya harapkan akan terlihat seperti ini:

          remark       desc        cat           subcat
0         NA           Present     NA            NA      
1         NA           Present     NA            NA
2         Category1    NA          insufficient  resolution         
3         Category2    Present     insufficient  information              
4         Category3    NA          Duplicate     ID repeated

Terimakasih banyak.

Jawaban

2 sammywemmy Aug 20 2020 at 04:10

Salah satu cara mengatasinya adalah dengan pemahaman daftar:

df[['cat', 'subcat']] = [("insufficient", "resolution")  if word == "Category1" else 
                         ("insufficient", "information") if word == "Category2" else
                         ("Duplicate", "ID repeated")    if word == "Category3" else 
                         ("NA", "NA")
                         for word in df.remark]

  remark      desc               cat         subcat
0   NA        Present          NA              NA
1   NA        Present          NA              NA
2   Category1   NA          insufficient    resolution
3   Category2   Present     insufficient    information
4   Category3   NA          Duplicate       ID repeated

Jawaban @ dm2 menunjukkan bagaimana melakukannya dengan fungsi Anda. Yang pertama apply(conditions)membuat rangkaian yang berisi tupel, yang kedua applymembuat kolom individual, membentuk kerangka data yang kemudian dapat Anda tetapkan ke catdan subcat.

Alasan mengapa saya menyarankan pemahaman daftar adalah karena, Anda berurusan dengan Strings, dan di Pandas, bekerja dengan string melalui vanilla python lebih sering daripada tidak lebih cepat. Selain itu, dengan pemahaman daftar, pemrosesan dilakukan sekali, Anda tidak perlu menerapkan fungsi kondisi dan kemudian memanggil pd.Series. Itu memberi Anda kecepatan yang lebih cepat. Pengujian akan menegaskan atau menghilangkan prasangka ini.

2 dm2 Aug 20 2020 at 04:12

Anda bisa melakukan:

 df[['cat','subcat']] = df['remark'].apply(conditions).apply(pd.Series)

Keluaran:

  remark      desc               cat         subcat
0   NA        Present          NA              NA
1   NA        Present          NA              NA
2   Category1   NA          insufficient    resolution
3   Category2   Present     insufficient    information
4   Category3   NA          Duplicate       ID repeated

Sunting: Ini mungkin cara yang lebih sederhana untuk menerapkan fungsi yang sudah Anda miliki, tetapi jika Anda memiliki DataFrame yang besar, untuk kode yang lebih cepat, periksa jawabannya oleh @sammywemmy menggunakan pemahaman daftar.

1 Quentin Aug 20 2020 at 04:13

Anda meneruskan keseluruhan di dataframemana Anda hanya perlu meneruskan variabel lambda ( x).

df[['cat','subcat']] = df['remark'].apply(lambda x: pd.Series([*conditions(x)]))

*pada iterable dapat unpackmelakukannya sehingga Anda tidak perlu memanggil fungsi yang sama dua kali untuk mengekstrak output. Mungkin kompiler menyelesaikan ini tetapi saya rasa tidak ...

RichieV Aug 20 2020 at 04:11

Anda dapat menggunakan series.replacedengan kamus pemetaan

df['cat'] = df.remark.replace({'Category1': 'insufficient',
    'Category2': 'insufficient', 'Category3': 'Duplicate'})
df['subcat'] = df.remark.replace({'Category1': 'resolution',
    'Category2': 'information', 'Category3': 'ID repeated'})

print(df)
      remark     desc           cat       subcat
0         NA  Present            NA           NA
1         NA  Present            NA           NA
2  Category1       NA  insufficient   resolution
3  Category2  Present  insufficient  information
4  Category3       NA     Duplicate  ID repeated