Saya memiliki bingkai data panda dengan beberapa kolom.
Sekarang saya tahu bahwa baris tertentu outlier berdasarkan nilai kolom tertentu.
Misalnya
kolom 'Vol' memiliki semua nilai sekitar
12xx
dan satu nilai adalah4000
(outlier).
Sekarang saya ingin mengecualikan baris-baris yang memiliki Vol
kolom seperti ini.
Jadi, pada dasarnya saya perlu meletakkan filter pada bingkai data sehingga kita memilih semua baris di mana nilai-nilai kolom tertentu berada dalam, katakanlah, 3 standar deviasi dari mean.
Apa cara yang elegan untuk mencapai ini?
Gunakan
boolean
pengindeksan seperti yang akan Anda lakukan dinumpy.array
Untuk seri itu mirip:
sumber
DataFrame.abs()
FYI, jugaDataFrame.clip()
clip()
, Jeff, garis besarnya tidak dihapus:df.SOME_DATA.clip(-3std,+3std)
tetapkan outliner ke +3 atau -3stddf_new = df[np.abs(df - df.mean()) <= (3 * df.std())]
. Namun berbeda dengan menerapkannya pada Seri atau kolom tunggal, ini akan menggantikan outlier dengannp.nan
dan mempertahankan bentuk DataFrame, sehingga interpolasi mungkin diperlukan untuk mengisi nilai yang hilang.Untuk setiap kolom bingkai data Anda, Anda bisa mendapatkan kuantil dengan:
lalu filter dengan:
Jika seseorang perlu menghapus outlier bawah dan atas, gabungkan kondisi dengan pernyataan AND:
sumber
Jawaban ini mirip dengan yang disediakan oleh @tanemaki, tetapi menggunakan
lambda
ekspresi sebagai gantiscipy stats
.Untuk memfilter DataFrame di mana hanya SATU kolom (misalnya 'B') dalam tiga standar deviasi:
Lihat di sini untuk cara menerapkan skor-z ini secara bergulir: Skor-skor bergulir diterapkan pada bingkai data panda
sumber
sumber
Untuk setiap seri dalam kerangka data, Anda bisa menggunakan
between
danquantile
menghapus outlier.sumber
Karena saya belum melihat jawaban yang berhubungan dengan atribut numerik dan non-numerik , inilah jawaban komplemen.
Anda mungkin ingin menjatuhkan outlier hanya pada atribut numerik (variabel kategori hampir tidak bisa outlier).
Definisi fungsi
Saya telah memperluas saran @ tanemaki untuk menangani data ketika atribut non-numerik juga hadir:
Pemakaian
Contoh
Bayangkan sebuah dataset
df
dengan beberapa nilai tentang rumah: gang, kontur tanah, harga jual, ... Misalnya: Dokumentasi DataPertama, Anda ingin memvisualisasikan data pada sebar grafik (dengan z-score Thresh = 3):
sumber
reduce=False
telah ditinggalkan sejakpandas
versi 0.23.0result_type='reduce'
untukreduce=False
.scipy.stats
memiliki metodetrim1()
dantrimboth()
untuk memotong outlier dalam satu baris, sesuai dengan peringkat dan persentase yang diperkenalkan dari nilai yang dihapus.sumber
trimboth
paling mudah bagi saya.Pilihan lain adalah mengubah data Anda sehingga efek pencilan dapat dikurangi. Anda dapat melakukan ini dengan memenangkan data Anda.
sumber
Jika Anda menyukai metode chaining, Anda bisa mendapatkan kondisi boolean Anda untuk semua kolom numerik seperti ini:
Setiap nilai dari setiap kolom akan dikonversi
True/False
berdasarkan pada apakah kurang dari tiga standar deviasi dari rata-rata atau tidak.sumber
le(3)
sejak menghapus outlier. Dengan cara ini Anda dapatkanTrue
untuk outlier. Selain itu +1 dan jawaban ini harus lebih tinggiAnda dapat menggunakan topeng boolean:
keluaran:
sumber
Karena saya berada dalam tahap awal perjalanan ilmu data saya, saya memperlakukan outlier dengan kode di bawah ini.
sumber
Dapatkan persentil ke-98 dan ke-2 sebagai batas outlier kami
sumber
contoh lengkap dengan data dan 2 kelompok berikut:
Impor:
Contoh data dengan 2 grup: G1: Grup 1. G2: Grup 2:
Baca data teks ke bingkai data panda:
Definisikan outlier menggunakan standar deviasi
Tentukan nilai data yang difilter dan pencilan:
Cetak hasilnya:
sumber
Fungsi saya untuk menjatuhkan outlier
sumber
Saya lebih suka memotong daripada menjatuhkan. berikut ini akan klip inplace di pecentil ke-2 dan ke-98.
sumber
Menghapus dan menghapus outlier saya yakin secara statistik salah. Itu membuat data berbeda dari data asli. Juga membuat data tidak berbentuk dan karenanya cara terbaik adalah mengurangi atau menghindari efek pencilan dengan log mentransformasikan data. Ini bekerja untuk saya:
sumber