Saya memiliki data dalam kolom yang berbeda tetapi saya tidak tahu cara mengekstraknya untuk menyimpannya dalam variabel lain.
index a b c
1 2 3 4
2 3 4 5
Bagaimana saya memilih 'a'
, 'b'
dan menyimpannya di df1?
Saya mencoba
df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']
Sepertinya tidak ada yang berhasil.
.ix
karena ambigu. Gunakan.iloc
atau.loc
jika Anda harus.> csvtable_imp_1 <- csvtable_imp[0:6]
dan ia memilih jumlah delta kolom pertama antara 0 dan 6. Yang harus saya lakukan adalah membaca tabel csv sebagaimana dibatasi dengan lib readr.infile_1 = largefile_stay.ix[:,0:6]
ix
sekarang sudah usang. Panda merekomendasikan untuk menggunakan:loc
(pengindeksan berbasis label) atauiloc
(pengindeksan berbasis posisi).Jawaban:
Nama kolom (yang merupakan string) tidak dapat diiris dengan cara Anda mencoba.
Di sini Anda memiliki beberapa opsi. Jika Anda tahu dari konteks, variabel mana yang ingin Anda potong, Anda bisa mengembalikan tampilan hanya kolom-kolom tersebut dengan meneruskan daftar ke dalam
__getitem__
sintaks (tanda []).Atau, jika penting untuk mengindeksnya secara numerik dan bukan dengan nama mereka (katakan kode Anda secara otomatis harus melakukan ini tanpa mengetahui nama dua kolom pertama) maka Anda dapat melakukan ini sebagai gantinya:
Selain itu, Anda harus membiasakan diri dengan gagasan tampilan ke objek Pandas vs salinan objek itu. Yang pertama dari metode di atas akan mengembalikan salinan baru dalam memori sub-objek yang diinginkan (irisan yang diinginkan).
Namun, kadang-kadang ada konvensi pengindeksan dalam Panda yang tidak melakukan ini dan sebaliknya memberikan Anda variabel baru yang hanya merujuk pada potongan memori yang sama dengan sub-objek atau irisan pada objek asli. Ini akan terjadi dengan cara pengindeksan kedua, sehingga Anda dapat memodifikasinya dengan
copy()
fungsi untuk mendapatkan salinan biasa. Ketika ini terjadi, mengubah apa yang Anda pikirkan adalah objek yang diiris kadang-kadang dapat mengubah objek asli. Selalu bagus untuk waspada untuk ini.Untuk menggunakannya
iloc
, Anda perlu mengetahui posisi kolom (atau indeks). Karena posisi kolom dapat berubah, alih-alih indeks hard-coding, Anda dapat menggunakaniloc
bersamaget_loc
fungsicolumns
metode objek dataframe untuk mendapatkan indeks kolom.Sekarang Anda dapat menggunakan kamus ini untuk mengakses kolom melalui nama dan menggunakan
iloc
.sumber
df[['a','b']]
menghasilkan salinanix[]
jika Anda lebih suka menggunakanix[]
untuk alasan apa pun.ix
indeks baris, bukan kolom. Saya pikir OP menginginkan kolom.ix
menerima argumen slice, jadi Anda juga bisa mendapatkan kolom. Misalnya,df.ix[0:2, 0:2]
dapatkan sub-array 2x2 kiri atas seperti halnya matriks NumPy (tergantung pada nama kolom Anda tentu saja). Anda bahkan dapat menggunakan sintaks slice pada nama string kolom, sepertidf.ix[0, 'Col1':'Col5']
. Itu mendapatkan semua kolom yang kebetulan dipesan antaraCol1
danCol5
dalamdf.columns
array. Tidak benar untuk mengatakan bahwaix
baris indeks. Itu hanya penggunaannya yang paling dasar. Ini juga mendukung pengindeksan lebih dari itu. Jadi,ix
sangat umum untuk pertanyaan ini..iloc
yang eksklusif dari posisi terakhir seperti daftar Python.Pada versi 0.11.0, kolom dapat diiris dengan cara Anda mencoba menggunakan
.loc
pengindeks:setara dengan
dan mengembalikan kolom
C
melaluiE
.Demo pada DataFrame yang dibuat secara acak:
Untuk mendapatkan kolom dari C ke E (perhatikan bahwa tidak seperti slice integer, 'E' termasuk dalam kolom):
Hal yang sama berlaku untuk memilih baris berdasarkan label. Dapatkan baris 'R6' hingga 'R10' dari kolom tersebut:
.loc
juga menerima array boolean sehingga Anda dapat memilih kolom yang sesuai entri dalam arrayTrue
. Misalnya,df.columns.isin(list('BCD'))
kembaliarray([False, True, True, True, False, False], dtype=bool)
- Benar jika nama kolom ada di daftar['B', 'C', 'D']
; Salah, sebaliknya.sumber
Dengan asumsi nama kolom Anda (
df.columns
) adalah['index','a','b','c']
, maka data yang Anda inginkan ada di kolom 3 & 4. Jika Anda tidak tahu nama mereka saat skrip Anda berjalan, Anda dapat melakukan iniSeperti yang ditunjukkan oleh EMS dalam jawabannya ,
df.ix
mengiris kolom sedikit lebih ringkas, tetapi.columns
antarmuka pengiris mungkin lebih alami karena menggunakan sintaksis daftar / pengindeksan daftar python vanilla 1-D.PERINGATAN:
'index'
adalah nama yang buruk untuk sebuahDataFrame
kolom. Label yang sama juga digunakan untukdf.index
atribut sebenarnya , sebuahIndex
array. Jadi kolom Anda dikembalikan olehdf['index']
dan indeks DataFrame nyata dikembalikan olehdf.index
. AnIndex
adalah jenis khusus yangSeries
dioptimalkan untuk pencarian nilai-nilai elemen itu. Untuk df.index itu untuk mencari baris dengan label mereka. Itudf.columns
atribut juga merupakanpd.Index
array, untuk mencari kolom dengan label mereka.sumber
.ix
adalah bukan hanya untuk baris. Ini untuk mengiris tujuan umum, dan dapat digunakan untuk mengiris multidimensi. Ini pada dasarnya hanya sebuah antarmuka untuk__getitem__
sintaks NumPy yang biasa . Yang mengatakan, Anda dapat dengan mudah mengubah masalah mengiris kolom menjadi masalah mengiris baris dengan hanya menerapkan operasi transposdf.T
,. Contoh Anda menggunakancolumns[1:3]
, yang sedikit menyesatkan. Hasilnyacolumns
adalah aSeries
; hati-hati jangan hanya memperlakukannya seperti array. Juga, Anda mungkin harus mengubahnyacolumns[2:3]
agar sesuai dengan komentar "3 & 4" Anda.[2:4]
benar. Anda[2:3]
salah. Dan menggunakan notasi pengiris python standar untuk menghasilkan urutan / Seri tidak menyesatkan IMO. Tapi saya suka memotong antarmuka DataFrame Anda untuk mengakses array numpy yang mendasarinyaix
.df.columns
dan ingin mengirisnya dengan label , maka Anda akan memiliki semantik slice yang berbeda daripada jika Anda mengirisnya dengan posisi indeks integer . Saya jelas tidak menjelaskannya dengan baik di komentar saya sebelumnya.columns
adalah Seri yang tidak dapat diubah dan pengambil telah diganti untuk menggunakan label sebagai indeks. Terima kasih telah meluangkan waktu untuk mengklarifikasi.sumber
df[['b as foo', 'c as bar']
sehingga output mengganti nama kolomb
sebagaifoo
dan kolomc
sebagaibar
?df[['b', 'c']].rename(columns = {'b' : 'foo', 'c' : 'bar'})
Saya menyadari pertanyaan ini sudah cukup lama, tetapi dalam versi panda terbaru ada cara mudah untuk melakukan hal ini. Nama kolom (yang merupakan string) dapat diiris dengan cara apa pun yang Anda suka.
sumber
Anda bisa memberikan daftar kolom yang akan dijatuhkan dan mengembalikan DataFrame hanya dengan kolom yang diperlukan menggunakan
drop()
fungsi pada Pandaf DataFrame.Hanya mengatakan
akan mengembalikan DataFrame hanya dengan kolom
b
danc
.The
drop
Metode ini didokumentasikan di sini .sumber
Dengan panda,
dengan nama kolom
untuk memilih berdasarkan iloc dan kolom tertentu dengan nomor indeks:
dengan nama kolom loc dapat digunakan seperti
sumber
Saya menemukan metode ini sangat berguna:
Rincian lebih lanjut dapat ditemukan di sini
sumber
surveys_df.iloc [:, [2,5]]
.Dimulai dengan 0.21.0, menggunakan
.loc
atau[]
dengan daftar dengan satu atau lebih label yang hilang sudah tidak digunakan lagi.reindex
. Jadi, jawaban untuk pertanyaan Anda adalah:df1 = df.reindex(columns=['b','c'])
Dalam versi sebelumnya, menggunakan
.loc[list-of-labels]
akan berfungsi selama setidaknya 1 kunci ditemukan (jika tidak maka akan meningkatkan aKeyError
). Perilaku ini sudah usang dan sekarang menampilkan pesan peringatan. Alternatif yang direkomendasikan adalah menggunakan.reindex()
.Baca lebih lanjut di Pengindeksan dan Memilih Data
sumber
Anda bisa menggunakan panda. Saya membuat DataFrame:
DataFrame:
Untuk memilih 1 atau lebih kolom dengan nama:
Anda juga bisa menggunakan:
Dan Anda mendapatkan kolom
Test_2
Anda juga dapat memilih kolom dan baris dari baris ini menggunakan
.loc()
. Ini disebut "mengiris" . Perhatikan bahwa saya ambil dari kolomTest_1
keTest_3
"Slice" adalah:
Dan jika Anda hanya ingin
Peter
danAnn
dari kolomTest_1
danTest_3
:Anda mendapatkan:
sumber
Jika Anda ingin mendapatkan satu elemen dengan indeks baris dan nama kolom, Anda dapat melakukannya seperti itu
df['b'][0]
. Ini sesederhana yang Anda bisa gambar.Atau Anda dapat menggunakan
df.ix[0,'b']
, campuran penggunaan indeks dan label.Catatan: Sejak v0.20
ix
sudah tidak digunakan lagi karenaloc
/iloc
.sumber
Satu pendekatan yang berbeda dan mudah: iterasi baris
menggunakan iterows
sumber
Berbagai pendekatan yang dibahas dalam respons di atas didasarkan pada asumsi bahwa pengguna tahu indeks kolom untuk turun atau subset, atau pengguna ingin subset dataframe menggunakan berbagai kolom (misalnya antara 'C': 'E') . pandas.DataFrame.drop () tentu saja merupakan pilihan untuk mengelompokkan data berdasarkan daftar kolom yang ditentukan oleh pengguna (meskipun Anda harus berhati-hati bahwa Anda selalu menggunakan salinan kerangka data dan parameter inplace tidak boleh disetel ke True !!)
Pilihan lain adalah menggunakan pandas.columns.difference () , yang melakukan perbedaan set pada nama kolom, dan mengembalikan tipe indeks array yang berisi kolom yang diinginkan. Berikut ini solusinya:
Outputnya adalah:
b c 1 3 4 2 4 5
sumber
df1 = df[df.columns.difference(columns_for_differencing)]
akan mengembalikan dataframe baru / disalin. Anda akan dapat memodifikasidf1
tanpa mengubahdf
. Terima kasih, btw. Inilah yang saya butuhkan.Anda juga dapat menggunakan df.pop ()
beri tahu saya jika ini membantu Anda, silakan gunakan df.pop (c)
sumber
Saya telah melihat beberapa jawaban tentang itu, tetapi tetap tidak jelas bagi saya. Bagaimana Anda memilih kolom yang diminati? Jawabannya adalah jika Anda mengumpulkannya dalam daftar, Anda bisa merujuk kolom menggunakan daftar.
Contoh
Saya memiliki daftar berikut / array numpy
extracted_features
, menentukan 63 kolom. Dataset asli memiliki 103 kolom, dan saya ingin mengekstrak persisnya, kemudian saya akan gunakanDan Anda akan berakhir dengan ini
Ini sesuatu yang akan Anda gunakan cukup sering dalam Pembelajaran Mesin (lebih khusus, dalam pemilihan fitur). Saya ingin membahas cara lain juga, tapi saya pikir itu sudah dibahas oleh stackoverflower lainnya. Semoga ini bermanfaat!
sumber
Anda dapat menggunakan
pandas.DataFrame.filter
metode untuk memfilter atau menyusun ulang kolom seperti ini:sumber
sumber