Saya mencoba memprogram ulang kode Stata saya ke Python untuk peningkatan kecepatan, dan saya diarahkan ke PANDAS. Saya, bagaimanapun, mengalami kesulitan memikirkan bagaimana memproses data.
Katakanlah saya ingin mengulang semua nilai di kepala kolom 'ID.' Jika ID itu cocok dengan nomor tertentu, maka saya ingin mengubah dua nilai yang sesuai FirstName dan LastName.
Di Stata terlihat seperti ini:
replace FirstName = "Matt" if ID==103
replace LastName = "Jones" if ID==103
Jadi ini menggantikan semua nilai di FirstName yang sesuai dengan nilai ID == 103 ke Matt.
Di PANDAS, saya mencoba sesuatu seperti ini
df = read_csv("test.csv")
for i in df['ID']:
if i ==103:
...
Tidak yakin hendak kemana setelah ini. Ada ide?
df.loc[df.ID == 103, ['FirstName', 'LastName']] = 'Matt', 'Jones'
Anda dapat menggunakannya
map
, itu dapat memetakan vales dari toko susu atau bahkan fungsi khusus.Misalkan ini df Anda:
Buat penisnya:
Dan peta:
Hasilnya adalah:
Atau gunakan fungsi khusus:
sumber
dict
dibuat untuk pemetaan. Jika tidak, beberapa pemeriksaan / pembersihan dapat dilakukan berdasarkan hal-hal seperti:df.ID.isin(names.keys())
Pertanyaan asli membahas kasus penggunaan sempit tertentu. Bagi mereka yang membutuhkan jawaban yang lebih umum, berikut beberapa contohnya:
Membuat kolom baru menggunakan data dari kolom lain
Diberikan dataframe di bawah ini:
Di bawah ini kami menambahkan
description
kolom baru sebagai rangkaian kolom lain dengan menggunakan+
operasi yang diganti untuk seri. Pemformatan string mewah, f-string, dll. Tidak akan berfungsi di sini karena+
berlaku untuk skalar dan bukan nilai 'primitif':Kami mendapatkan
1 years
untuk kucing (bukan1 year
) yang akan kami perbaiki di bawah ini menggunakan kondisional.Mengubah kolom yang sudah ada dengan kondisional
Di sini kami mengganti
animal
kolom asli dengan nilai dari kolom lain, dan menggunakannp.where
untuk mengatur substring bersyarat berdasarkan nilaiage
:Mengubah beberapa kolom dengan kondisional
Pendekatan yang lebih fleksibel adalah dengan memanggil
.apply()
seluruh kerangka data daripada pada satu kolom:Dalam kode di atas
transform_row(r)
fungsi mengambilSeries
objek yang mewakili baris tertentu (ditunjukkan olehaxis=1
, nilai defaultaxis=0
akan menyediakanSeries
objek untuk setiap kolom). Ini menyederhanakan pemrosesan karena kita dapat mengakses nilai 'primitif' aktual di baris menggunakan nama kolom dan memiliki visibilitas sel lain di baris / kolom tertentu.sumber
np.where
mungkin yang Anda cari, lihat misalnya stackoverflow.com/a/42540310/191246 tetapi mungkin juga Anda tidak dapat menyesuaikan logika ke dalam operasi skalar, maka Anda perlu mengubah secara eksplisit sel secara numerik mirip dengan yang dilakukan ditransform_row
Pertanyaan ini mungkin masih cukup sering dikunjungi sehingga ada baiknya menawarkan tambahan pada jawaban Mr Kassies. The
dict
built-in kelas dapat sub-digolongkan sehingga default dikembalikan untuk kunci 'hilang'. Mekanisme ini bekerja dengan baik untuk panda. Tapi lihat di bawah.Dengan cara ini dimungkinkan untuk menghindari kesalahan kunci.
Hal yang sama dapat dilakukan dengan lebih sederhana dengan cara berikut. Penggunaan argumen 'default' untuk
get
metode objek dict membuatnya tidak perlu membuat subclass dict.sumber