Saya mencoba untuk mengganti nilai dalam satu kolom dataframe. Kolom ('female') hanya berisi nilai 'female' dan 'male'.
Saya telah mencoba yang berikut ini:
w['female']['female']='1'
w['female']['male']='0'
Tetapi menerima salinan yang sama persis dari hasil sebelumnya.
Idealnya saya ingin mendapatkan beberapa output yang menyerupai elemen loop berikut-bijaksana.
if w['female'] =='female':
w['female'] = '1';
else:
w['female'] = '0';
Saya telah memeriksa dokumentasi gotchas ( http://pandas.pydata.org/pandas-docs/stable/gotchas.html ) tetapi tidak dapat menemukan mengapa tidak terjadi apa-apa.
Bantuan apa pun akan dihargai.
.loc
sintaks untuk menghindariSettingWithCopyWarning
: pandas.pydata.org/pandas-docs/stable/…Anda dapat mengedit subset dataframe dengan menggunakan loc:
Pada kasus ini:
w.loc[w.female != 'female', 'female'] = 0 w.loc[w.female == 'female', 'female'] = 1
sumber
w.female.replace(to_replace=dict(female=1, male=0), inplace=True)
Lihat dokumen pandas.DataFrame.replace () .
sumber
Variasi kecil:
w.female.replace(['male', 'female'], [1, 0], inplace=True)
sumber
Ini juga harus bekerja:
w.female[w.female == 'female'] = 1 w.female[w.female == 'male'] = 0
sumber
Anda juga dapat menggunakan
apply
dengan.get
iew['female'] = w['female'].apply({'male':0, 'female':1}.get)
:w = pd.DataFrame({'female':['female','male','female']}) print(w)
Dataframe
w
:female 0 female 1 male 2 female
Menggunakan
apply
untuk mengganti nilai dari kamus:w['female'] = w['female'].apply({'male':0, 'female':1}.get) print(w)
Hasil:
female 0 1 1 0 2 1
Catatan:
apply
with dictionary harus digunakan jika semua nilai yang mungkin dari kolom dalam dataframe didefinisikan dalam kamus lain, itu akan kosong untuk yang tidak didefinisikan dalam kamus.sumber
Ini sangat kompak:
w['female'][w['female'] == 'female']=1 w['female'][w['female'] == 'male']=0
Satu lagi bagus:
w['female'] = w['female'].replace(regex='female', value=1) w['female'] = w['female'].replace(regex='male', value=0)
sumber
Sebagai alternatif, ada fungsi built-in pd.get_dummies untuk jenis tugas ini:
w['female'] = pd.get_dummies(w['female'],drop_first = True)
Ini memberi Anda bingkai data dengan dua kolom, satu untuk setiap nilai yang terjadi di w ['female'], di mana Anda melepaskan yang pertama (karena Anda dapat menyimpulkannya dari yang tersisa). Kolom baru secara otomatis dinamai sebagai string yang Anda ganti.
Ini sangat berguna jika Anda memiliki variabel kategori dengan lebih dari dua kemungkinan nilai. Fungsi ini membuat sebanyak mungkin variabel dummy yang diperlukan untuk membedakan semua kasus. Berhati-hatilah agar Anda tidak menetapkan keseluruhan frame data ke satu kolom, tetapi sebaliknya, jika w ['female'] bisa jadi 'male', 'female' atau 'neutral', lakukan sesuatu seperti ini:
w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1]) w.drop('female', axis = 1, inplace = True)
Kemudian Anda memiliki dua kolom baru yang memberi Anda kode dummy 'perempuan' dan Anda menyingkirkan kolom dengan string.
sumber
Menggunakan
Series.map
denganSeries.fillna
Jika kolom Anda berisi lebih banyak string daripada
female
danmale
,Series.map
akan gagal dalam kasus ini karena akan mengembalikanNaN
nilai lain.Itu sebabnya kami harus merantai dengan
fillna
:Contoh mengapa
.map
gagal :df = pd.DataFrame({'female':['male', 'female', 'female', 'male', 'other', 'other']}) female 0 male 1 female 2 female 3 male 4 other 5 other
df['female'].map({'female': '1', 'male': '0'}) 0 0 1 1 2 1 3 0 4 NaN 5 NaN Name: female, dtype: object
Untuk metode yang benar , kita rantai
map
denganfillna
, jadi kita isiNaN
dengan nilai dari kolom asli:df['female'].map({'female': '1', 'male': '0'}).fillna(df['female']) 0 0 1 1 2 1 3 0 4 other 5 other Name: female, dtype: object
sumber
Ada juga fungsi di
pandas
panggilfactorize
yang dapat Anda gunakan untuk melakukan jenis pekerjaan ini secara otomatis. Itu mengkonversi label untuk nomor:['male', 'female', 'male'] -> [0, 1, 0]
. Lihat jawaban ini untuk informasi lebih lanjut.sumber
Saya pikir sebagai jawaban harus ditunjukkan jenis objek yang Anda dapatkan di semua metode yang disarankan di atas: apakah itu Seri atau DataFrame.
Ketika Anda mendapatkan kolom dengan
w.female.
atauw[[2]]
(di mana, misalkan, 2 adalah nomor kolom Anda), Anda akan mendapatkan kembali DataFrame. Jadi dalam hal ini Anda dapat menggunakan metode DataFrame seperti.replace
.Ketika Anda menggunakan
.loc
atauiloc
Anda mendapatkan kembali Seri, dan Seri tidak memiliki.replace
metode, jadi Anda harus menggunakan metode sepertiapply
,map
dan seterusnya.sumber
dic = {'female':1, 'male':0} w['female'] = w['female'].replace(dic)
.replace memiliki argumen kamus di mana Anda dapat mengubah dan melakukan apa pun yang Anda inginkan atau butuhkan.
sumber