Jika Anda hanya memiliki dua pilihan untuk dipilih:
df['color'] = np.where(df['Set']=='Z', 'green', 'red')
Sebagai contoh,
import pandas as pd
import numpy as np
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
df['color'] = np.where(df['Set']=='Z', 'green', 'red')
print(df)
hasil panen
Set Type color
0 Z A green
1 Z B green
2 X B red
3 Y C red
Jika Anda memiliki lebih dari dua syarat, gunakannp.select
. Misalnya, jika Anda ingin color
menjadi
yellow
kapan (df['Set'] == 'Z') & (df['Type'] == 'A')
- sebaliknya
blue
kapan(df['Set'] == 'Z') & (df['Type'] == 'B')
- sebaliknya
purple
kapan(df['Type'] == 'B')
- jika tidak
black
,
lalu gunakan
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
conditions = [
(df['Set'] == 'Z') & (df['Type'] == 'A'),
(df['Set'] == 'Z') & (df['Type'] == 'B'),
(df['Type'] == 'B')]
choices = ['yellow', 'blue', 'purple']
df['color'] = np.select(conditions, choices, default='black')
print(df)
yang menghasilkan
Set Type color
0 Z A yellow
1 Z B blue
2 X B purple
3 Y C black
df['foo'] = np.where(df['Set']=='Z', df['Set'], df['Type'].shift(1))
Pemahaman daftar adalah cara lain untuk membuat kolom lain secara kondisional. Jika Anda bekerja dengan objek tipe dalam kolom, seperti dalam contoh Anda, daftar pemahaman biasanya mengungguli sebagian besar metode lain.
Pemahaman daftar contoh:
% tes timeit:
sumber
pd.DataFrame({'Type':list('ABBC')*100000, 'Set':list('ZZXY')*100000})
size),numpy.where
melampauimap
, tetapi pemahaman daftar adalah raja (sekitar 50% lebih cepat darinumpy.where
).df['color'] = ['red' if (x['Set'] == 'Z') & (x['Type'] == 'B') else 'green' for x in df]
df['color_type'] = np.where(df['Set']=='Z', 'green', df['Type'])
.iterrows()
terkenal lamban dan DataFrame tidak boleh dimodifikasi saat iterasi.Cara lain untuk mencapai hal ini adalah
sumber
Berikut ini cara lain untuk menguliti kucing ini, menggunakan kamus untuk memetakan nilai baru ke tombol dalam daftar:
Seperti apa itu:
Pendekatan ini bisa sangat kuat ketika Anda memiliki banyak
ifelse
pernyataan tipe-untuk membuat (yaitu banyak nilai unik untuk diganti).Dan tentu saja Anda selalu bisa melakukan ini:
Tetapi pendekatan itu lebih dari tiga kali lebih lambat dari
apply
pendekatan dari atas, pada mesin saya.Dan Anda juga bisa melakukan ini, menggunakan
dict.get
:sumber
.map()
solusinya ~ 10 kali lebih cepat daripada.apply()
..apply()
membutuhkan waktu 47 detik, dibandingkan hanya 5,91 detik untuk.map()
.Berikut ini lebih lambat daripada pendekatan waktu di sini , tetapi kami dapat menghitung kolom tambahan berdasarkan konten lebih dari satu kolom, dan lebih dari dua nilai dapat dihitung untuk kolom tambahan.
Contoh sederhana hanya menggunakan kolom "Set":
Contoh dengan lebih banyak warna dan lebih banyak kolom yang diperhitungkan:
Sunting (21/06/2019): Menggunakan plydata
Dimungkinkan juga untuk menggunakan plydata untuk melakukan hal-hal semacam ini (ini tampaknya lebih lambat daripada menggunakan
assign
danapply
, meskipun).Sederhana
if_else
:Bersarang
if_else
:sumber
Mungkin ini telah dimungkinkan dengan pembaruan Pandas yang lebih baru, tetapi saya pikir yang berikut ini adalah jawaban terpendek dan mungkin terbaik untuk pertanyaan itu, sejauh ini. Anda dapat menggunakan
.loc
metode ini dan menggunakan satu kondisi atau beberapa tergantung pada kebutuhan Anda.Ringkasan Kode:
Penjelasan:
tambahkan kolom 'warna' dan setel semua nilai ke "merah"
Terapkan satu kondisi Anda:
atau beberapa kondisi jika Anda ingin:
Anda dapat membaca tentang operator logis Pandas dan pemilihan bersyarat di sini: Operator logis untuk pengindeksan boolean di Pandas
sumber
df.loc[(df['Set']=="Z") & (df['Type']=="A"), 'Color'] = "green"
Satu liner dengan
.apply()
metode adalah sebagai berikut:Setelah itu,
df
bingkai data terlihat seperti ini:sumber
Jika Anda bekerja dengan data besar, pendekatan memo yang terbaik:
Pendekatan ini akan menjadi tercepat ketika Anda memiliki banyak nilai berulang. Aturan umum saya adalah untuk memo ketika:
data_size
>10**4
&n_distinct
<data_size/4
Ex Memoize dalam kasus 10.000 baris dengan nilai berbeda 2.500 atau kurang.
sumber
random.choices()
.