Terapkan fungsi Python ke satu kolom pandas dan terapkan hasilnya ke beberapa kolom
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
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 apply
membuat kolom individual, membentuk kerangka data yang kemudian dapat Anda tetapkan ke cat
dan 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.
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.
Anda meneruskan keseluruhan di dataframe
mana Anda hanya perlu meneruskan variabel lambda ( x
).
df[['cat','subcat']] = df['remark'].apply(lambda x: pd.Series([*conditions(x)]))
*
pada iterable dapat unpack
melakukannya sehingga Anda tidak perlu memanggil fungsi yang sama dua kali untuk mengekstrak output. Mungkin kompiler menyelesaikan ini tetapi saya rasa tidak ...
Anda dapat menggunakan series.replace
dengan 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