Saya memiliki DataFrame, dan saya ingin mengganti nilai di kolom tertentu yang melebihi nilai dengan nol. Saya pikir ini adalah cara untuk mencapai ini:
df[df.my_channel > 20000].my_channel = 0
Jika saya menyalin saluran ke dalam bingkai data baru, itu sederhana:
df2 = df.my_channel
df2[df2 > 20000] = 0
Ini persis seperti yang saya inginkan, tetapi tampaknya tidak berfungsi dengan saluran sebagai bagian dari DataFrame asli.
Jawaban:
.ix
pengindeks berfungsi dengan baik untuk versi pandas sebelum 0.20.0, tetapi karena pandas 0.20.0,.ix
pengindeks tidak digunakan lagi , jadi Anda harus menghindari penggunaannya. Sebagai gantinya, Anda dapat menggunakan.loc
atauiloc
pengindeks. Anda dapat mengatasi masalah ini dengan:Atau, dalam satu baris,
mask
membantu Anda untuk memilih baris yangdf.my_channel > 20000
merupakanTrue
, sedangkandf.loc[mask, column_name] = 0
set nilai 0 ke baris yang dipilih manamask
memegang di kolom yang namanyacolumn_name
.Pembaruan: Dalam hal ini, Anda harus menggunakan
loc
karena jika Anda menggunakaniloc
, Anda akan mendapatkan pemberitahuanNotImplementedError
bahwa pengindeksan boolean berbasis iLocation pada tipe integer tidak tersedia .sumber
Mencoba
Catatan: Sejak v0.20.0,
ix
sudah tidak digunakan lagi karena mendukungloc
/iloc
.sumber
np.where
fungsi berfungsi sebagai berikut:Dalam kasus Anda, Anda ingin:
sumber
Alasan bingkai data asli Anda tidak diperbarui adalah karena pengindeksan berantai dapat menyebabkan Anda mengubah salinan daripada tampilan bingkai data Anda. The docs memberikan nasihat ini:
Anda memiliki beberapa alternatif: -
loc
+ Pengindeksan Booleanloc
dapat digunakan untuk menyetel nilai dan mendukung topeng Boolean:mask
+ Pengindeksan BooleanAnda dapat menetapkan ke seri Anda:
Atau Anda dapat memperbarui serial Anda di tempat:
np.where
+ Pengindeksan BooleanAnda dapat menggunakan NumPy dengan menetapkan rangkaian asli Anda saat kondisi Anda tidak memuaskan; Namun, dua solusi pertama lebih bersih karena hanya mengubah nilai yang ditentukan secara eksplisit.
sumber
Saya akan menggunakan
lambda
fungsi padaSeries
aDataFrame
seperti ini:Saya tidak menegaskan bahwa ini adalah cara yang efisien, tetapi berfungsi dengan baik.
sumber
loc
sini, sepertidf.loc[: , 'my_column'] = df['my_column'].map(f)
. Saya tidak tahu apakah itu cepat seperti yang Anda tambahkan di bawah.Coba ini:
df.my_channel = df.my_channel.where(df.my_channel <= 20000, other= 0)
atau
df.my_channel = df.my_channel.mask(df.my_channel > 20000, other= 0)
sumber