Saya punya dua bingkai data panda yang memiliki beberapa baris yang sama.
Misalkan dataframe2 adalah subset dari dataframe1.
Bagaimana saya bisa mendapatkan baris dataframe1 yang tidak ada di dataframe2?
df1 = pandas.DataFrame(data = {'col1' : [1, 2, 3, 4, 5], 'col2' : [10, 11, 12, 13, 14]})
df2 = pandas.DataFrame(data = {'col1' : [1, 2, 3], 'col2' : [10, 11, 12]})
Jawaban:
Salah satu metode akan menyimpan hasil dari gabungan dalam bentuk kedua dfs, maka kita dapat dengan mudah memilih baris ketika nilai satu kolom tidak dalam kesamaan ini:
EDIT
Metode lain seperti yang Anda temukan adalah menggunakan
isin
yang akan menghasilkanNaN
baris yang bisa Anda jatuhkan:Namun jika df2 tidak memulai baris dengan cara yang sama maka ini tidak akan berfungsi:
akan menghasilkan seluruh df:
sumber
df1[~df1.isin(df2)].dropna(how = 'all')
sepertinya melakukan trik. Terima kasih - jawaban Anda membantu saya menemukan solusi.isin
mengharuskan kedua dfs mulai dengan nilai baris yang sama jadi misalnya jika df2df2 = pd.DataFrame(data = {'col1' : [2, 3,4], 'col2' : [11,12, 13]})
maka metode Anda tidak akan berfungsikeep=False
:df0.append(df1).drop_duplicates(keep=False)
, secara default itu membuat duplikat pertama, Anda ingin drop semua duplikatSolusi yang dipilih saat ini menghasilkan hasil yang salah. Untuk mengatasi masalah ini dengan benar, kita dapat melakukan join-kiri dari
df1
hinggadf2
, memastikan untuk mendapatkan terlebih dahulu baris unik untukdf2
.Pertama, kita perlu memodifikasi DataFrame asli untuk menambahkan baris dengan data [3, 10].
Lakukan join-kiri, hilangkan duplikat
df2
sehingga setiap barisdf1
bergabung dengan tepat 1 barisdf2
. Gunakan parameterindicator
untuk mengembalikan kolom tambahan yang menunjukkan dari tabel mana baris itu berasal.Buat kondisi boolean:
Mengapa solusi lain salah
Beberapa solusi membuat kesalahan yang sama - mereka hanya memeriksa bahwa setiap nilai secara independen di setiap kolom, tidak bersama di baris yang sama. Menambahkan baris terakhir, yang unik tetapi memiliki nilai dari kedua kolom dari
df2
memperlihatkan kesalahan:Solusi ini mendapatkan hasil yang salah yang sama:
sumber
df_all[df_all['_merge'] == 'left_only']
untuk memiliki df dengan hasilnyaDengan asumsi bahwa indeks konsisten dalam kerangka data (tidak memperhitungkan nilai col aktual):
sumber
df1
indeks yang TIDAK di dalamnyadf2.index
". Lebih lanjut tentang negasi: stackoverflow.com/q/19960077/304209 (yang mengejutkan, saya tidak dapat menemukan sebutan tilde di panda docs).ValueError: Item wrong length x instead of y.
Seperti yang sudah diisyaratkan, isin membutuhkan kolom dan indeks yang sama untuk sebuah pertandingan. Jika kecocokan hanya pada konten baris, salah satu cara untuk mendapatkan topeng untuk memfilter hadiah saat ini adalah dengan mengubah baris ke indeks (Multi):
Jika indeks harus diperhitungkan, set_index memiliki argumen kata kunci ditambahkan untuk menambahkan kolom ke indeks yang ada. Jika kolom tidak berbaris, daftar (kolom df) dapat diganti dengan spesifikasi kolom untuk menyelaraskan data.
sebagai alternatif dapat digunakan untuk membuat indeks, meskipun saya ragu ini lebih efisien.
sumber
Misalkan Anda memiliki dua kerangka data, df_1 dan df_2 yang memiliki banyak bidang (column_names) dan Anda ingin menemukan satu-satunya entri di df_1 yang tidak ada di df_2 berdasarkan beberapa bidang (mis. Fields_x, fields_y), ikuti langkah-langkah berikut.
Step1.Tambahkan kunci kolom1 dan kunci2 masing-masing ke df_1 dan df_2.
Step2.Merge kerangka data seperti yang ditunjukkan di bawah ini. field_x dan field_y adalah kolom yang diinginkan.
Step3.Pilih hanya baris-baris dari df_1 di mana key1 tidak sama dengan key2.
Step4.Drop key1 dan key2.
Metode ini akan menyelesaikan masalah Anda dan bekerja dengan cepat bahkan dengan set data besar. Saya sudah mencobanya untuk kerangka data dengan lebih dari 1.000.000 baris.
sumber
agak terlambat, tetapi mungkin ada baiknya memeriksa parameter "indikator" dari pd.merge.
Lihat pertanyaan lain ini sebagai contoh: Bandingkan PandaF DataFrames dan kembalikan baris yang hilang dari yang pertama
sumber
Anda dapat melakukannya menggunakan metode isin (dict) :
Penjelasan:
sumber
Anda juga dapat concat
df1
,df2
:dan kemudian hapus semua duplikat:
sumber
Bagaimana dengan ini:
sumber
Berikut ini cara lain untuk menyelesaikan ini:
Atau:
sumber
Cara saya melakukan ini melibatkan menambahkan kolom baru yang unik untuk satu kerangka data dan menggunakan ini untuk memilih apakah akan menyimpan entri
Ini membuatnya jadi setiap entri di df1 memiliki kode - 0 jika unik untuk df1, 1 jika ada di kedua dataFrames. Anda kemudian menggunakan ini untuk membatasi apa yang Anda inginkan
sumber
sumber