Apa cara termudah untuk menghapus kolom duplikat dari kerangka data?
Saya membaca file teks yang memiliki kolom duplikat melalui:
import pandas as pd
df=pd.read_table(fname)
Nama kolomnya adalah:
Time, Time Relative, N2, Time, Time Relative, H2, etc...
Semua kolom Relatif Waktu dan Waktu berisi data yang sama. Saya ingin:
Time, Time Relative, N2, H2
Semua upaya saya untuk menjatuhkan, menghapus, dll seperti:
df=df.T.drop_duplicates().T
Menghasilkan kesalahan indeks dengan nilai unik:
Reindexing only valid with uniquely valued index objects
Maaf telah menjadi noob Pandas. Setiap Saran akan dihargai.
detil tambahan
Versi Pandas: 0.9.0
Python Versi: 2.7.3
Windows 7
(diinstal melalui Pythonxy 2.7.3.0)
file data (catatan: di file asli, kolom dipisahkan oleh tab, di sini dipisahkan oleh 4 spasi):
Time Time Relative [s] N2[%] Time Time Relative [s] H2[ppm]
2/12/2013 9:20:55 AM 6.177 9.99268e+001 2/12/2013 9:20:55 AM 6.177 3.216293e-005
2/12/2013 9:21:06 AM 17.689 9.99296e+001 2/12/2013 9:21:06 AM 17.689 3.841667e-005
2/12/2013 9:21:18 AM 29.186 9.992954e+001 2/12/2013 9:21:18 AM 29.186 3.880365e-005
... etc ...
2/12/2013 2:12:44 PM 17515.269 9.991756+001 2/12/2013 2:12:44 PM 17515.269 2.800279e-005
2/12/2013 2:12:55 PM 17526.769 9.991754e+001 2/12/2013 2:12:55 PM 17526.769 2.880386e-005
2/12/2013 2:13:07 PM 17538.273 9.991797e+001 2/12/2013 2:13:07 PM 17538.273 3.131447e-005
import pandas as pd; pd.__version__
)read_table
contoh yang saya buat.Jawaban:
Ada solusi satu baris untuk masalah ini. Ini berlaku jika beberapa nama kolom diduplikasi dan Anda ingin menghapusnya:
Bagaimana itu bekerja:
Misalkan kolom dari bingkai data adalah
['alpha','beta','alpha']
df.columns.duplicated()
mengembalikan array boolean: aTrue
atauFalse
untuk setiap kolom. Jika sudahFalse
maka nama kolom tersebut unik sampai pada titik tersebut, jika sudahTrue
maka nama kolom tersebut sudah terduplikasi tadi. Misalnya, dengan menggunakan contoh yang diberikan, nilai yang dikembalikan adalah[False,False,True]
.Pandas
memungkinkan seseorang untuk mengindeks menggunakan nilai boolean di mana ia hanya memilihTrue
nilainya. Karena kita ingin mempertahankan kolom yang tidak digandakan, kita membutuhkan array boolean di atas untuk dibalik (yaitu[True, True, False] = ~[False,False,True]
)Terakhir,
df.loc[:,[True,True,False]]
pilih hanya kolom yang tidak diduplikasi menggunakan kemampuan pengindeksan yang disebutkan di atas.Catatan : di atas hanya memeriksa nama kolom, bukan nilai kolom.
sumber
df.T.drop_duplicates().T
.Sepertinya Anda sudah mengetahui nama kolom yang unik. Jika itu masalahnya, maka
df = df['Time', 'Time Relative', 'N2']
akan berhasil.Jika tidak, solusi Anda akan berhasil:
Anda mungkin memiliki sesuatu yang spesifik untuk data Anda yang mengacaukannya. Kami dapat memberikan bantuan lebih lanjut jika ada detail lebih lanjut yang dapat Anda berikan kepada kami tentang data.
Sunting: Seperti kata Andy, masalahnya mungkin dengan judul kolom duplikat.
Untuk file tabel sampel 'dummy.csv' saya membuat:
menggunakan
read_table
memberikan kolom unik dan berfungsi dengan baik:Jika versi Anda tidak memungkinkan, Anda dapat meretas solusi untuk membuatnya unik:
sumber
df['Time']
memilih semua Time series (yaitu mengembalikan DataFrame), dandf['Time', ..]
ini akan mengembalikan seluruh DataFrame.RecursionError: maximum recursion depth exceeded
Transposing tidak efisien untuk DataFrames besar. Berikut ini alternatifnya:
Gunakan seperti ini:
Edit
Versi hemat memori yang memperlakukan nans seperti nilai lainnya:
sumber
my_df.T.drop_duplicates().T
akan tergantung pada dataframe besar./usr/local/lib/python3.5/dist-packages/ipykernel_launcher.py:17: DeprecationWarning: 'pandas.core.common.array_equivalent' is deprecated and is no longer public API
if array_equivalent(ia, ja):
denganif np.array_equal(ia, ja):
tampaknya menghasilkan hasil yang sama tetapi saya membaca bahwa itu tidak menangani NaN dengan baik.array_equivalent
masih tersedia di repo publik, mungkin di cabang yang lebih lama?numpy.array_equiv
; untuk panda, saya tidak melihat cabang rilis sebelumnya di GitHub,pandas.core.common
tetapi mungkin ada tempat lain untuk dilihatJika saya tidak salah, berikut ini melakukan apa yang diminta tanpa masalah memori dari solusi transpose dan dengan lebih sedikit baris dari fungsi @kalu, menjaga kolom pertama dari setiap kolom bernama serupa.
sumber
Sepertinya Anda berada di jalan yang benar. Ini satu baris yang Anda cari:
Tetapi karena tidak ada kerangka data contoh yang menghasilkan pesan kesalahan yang direferensikan
Reindexing only valid with uniquely valued index objects
, sulit untuk mengatakan dengan tepat apa yang akan menyelesaikan masalah. jika memulihkan indeks asli penting bagi Anda, lakukan ini:sumber
Langkah pertama: - Baca baris pertama, yaitu semua kolom, hapus semua kolom duplikat.
Langkah kedua: - Akhirnya hanya membaca kolom itu.
sumber
Saya mengalami masalah ini di mana satu baris yang disediakan oleh jawaban pertama bekerja dengan baik. Namun, saya memiliki kerumitan ekstra di mana salinan kolom kedua memiliki semua data. Salinan pertama tidak.
Solusinya adalah membuat dua bingkai data dengan memisahkan satu bingkai data dengan mengubah operator negasi. Setelah saya memiliki dua bingkai data, saya menjalankan pernyataan gabungan menggunakan
lsuffix
. Dengan cara ini, saya kemudian dapat mereferensikan dan menghapus kolom tanpa data.- E
sumber
Cara di bawah ini akan mengidentifikasi kolom dupe untuk meninjau apa yang salah dalam membangun kerangka data aslinya.
sumber
Cara cepat dan mudah untuk menjatuhkan kolom duplikat menurut nilainya:
df = df.T.drop_duplicates (). T
Info selengkapnya: manual drop_duplicates DataFrame Pandas .
sumber