Saya ingin tahu mengapa df[2]
tidak didukung, sementara df.ix[2]
dan df[2:3]
keduanya berfungsi.
In [26]: df.ix[2]
Out[26]:
A 1.027680
B 1.514210
C -1.466963
D -0.162339
Name: 2000-01-03 00:00:00
In [27]: df[2:3]
Out[27]:
A B C D
2000-01-03 1.02768 1.51421 -1.466963 -0.162339
Saya berharap df[2]
untuk bekerja dengan cara yang sama df[2:3]
agar konsisten dengan konvensi pengindeksan Python. Apakah ada alasan desain untuk tidak mendukung baris pengindeksan oleh integer tunggal?
df.ix[2]
tidak bekerja - setidaknya tidak dipandas version '0.19.2'
[]
, lihat jawaban ini di bawah . Juga TIDAK PERNAH MENGGUNAKAN.ix
, itu ditinggalkanJawaban:
menggema @HYRY, lihat dokumen baru di 0.11
http://pandas.pydata.org/pandas-docs/stable/indexing.html
Di sini kami memiliki operator baru,
.iloc
untuk explicity, hanya mendukung pengindeksan bilangan bulat, dan.loc
untuk explicity hanya mendukung pengindeksan labelmisalnya bayangkan skenario ini
[]
hanya mengiris baris (berdasarkan lokasi label)sumber
iloc
baris danloc
label..iloc
mencari hal berdasarkan pesanan mereka dalam indeks (mis..iloc[[2]]
) adalah "baris" kedua didf
. Baris itu berada di lokasi indeks4
..loc
mencari mereka berdasarkan nilai indeks mereka. Jadi mungkin "iloc" sama seperti "i"A[i]
? :)df.loc[-1] = df.iloc[[0]]
, dan masukkan itu? Bingkai dilengkapi dengan kolom indeks tambahan yang memberikan kesalahanValueError: cannot set a row with mismatched columns
(lihat stackoverflow.com/questions/47340571/… )Tujuan utama dari operator pengindeksan DataFrame,
[]
adalah untuk memilih kolom.Ketika operator pengindeksan melewati string atau integer, ia berusaha untuk menemukan kolom dengan nama tertentu dan mengembalikannya sebagai sebuah Seri.
Jadi, dalam pertanyaan di atas:
df[2]
mencari nama kolom yang cocok dengan nilai integer2
. Kolom ini tidak ada danKeyError
dinaikkan.Operator pengindeksan DataFrame sepenuhnya mengubah perilaku untuk memilih baris ketika notasi slice digunakan
Anehnya, ketika diberikan sepotong, operator pengindeksan DataFrame memilih baris dan dapat melakukannya dengan lokasi integer atau dengan label indeks.
Ini akan mengiris mulai dari baris dengan lokasi integer 2 hingga 3, eksklusif dari elemen terakhir. Jadi, hanya satu baris. Berikut ini memilih baris yang dimulai pada lokasi integer 6 hingga tetapi tidak termasuk 20 pada setiap baris ketiga.
Anda juga bisa menggunakan irisan yang terdiri dari label string jika indeks DataFrame Anda memiliki string di dalamnya. Untuk detail lebih lanjut, lihat solusi ini di .iloc vs .loc .
Saya hampir tidak pernah menggunakan notasi slice ini dengan operator pengindeksan karena tidak eksplisit dan jarang digunakan. Saat mengiris baris, pertahankan
.loc/.iloc
.sumber
Anda dapat menganggap DataFrame sebagai diktator Seri.
df[key]
coba pilih indeks kolom dengankey
dan mengembalikan objek Seri.Namun mengiris dalam [] mengiris baris, karena ini adalah operasi yang sangat umum.
Anda dapat membaca dokumen dengan detail:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
sumber
Untuk akses berbasis indeks ke tabel panda, kita juga dapat mempertimbangkan opsi numpy.as_array untuk mengonversi tabel ke array Numpy sebagai
lalu
akan bekerja.
sumber
Anda dapat melihat kode sumbernya .
DataFrame
memiliki fungsi pribadi_slice()
untuk mengirisDataFrame
, dan memungkinkan parameteraxis
untuk menentukan sumbu mana yang akan diiris. The__getitem__()
untukDataFrame
tidak menetapkan sumbu sementara memohon_slice()
. Jadi_slice()
iris secara default sumbu 0.Anda dapat mengambil percobaan sederhana, yang mungkin membantu Anda:
sumber
Anda dapat mengulang melalui bingkai data seperti ini.
sumber