Memilih deretan seri panda / bingkai data berdasarkan indeks integer

395

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?

cs95
sumber
4
df.ix[2]tidak bekerja - setidaknya tidak dipandas version '0.19.2'
Zahra
9
Untuk melihat perbedaan antara pemilihan baris dan kolom melalui operator pengindeksan [], lihat jawaban ini di bawah . Juga TIDAK PERNAH MENGGUNAKAN .ix, itu ditinggalkan
Ted Petrou

Jawaban:

552

menggema @HYRY, lihat dokumen baru di 0.11

http://pandas.pydata.org/pandas-docs/stable/indexing.html

Di sini kami memiliki operator baru, .ilocuntuk explicity, hanya mendukung pengindeksan bilangan bulat, dan .locuntuk explicity hanya mendukung pengindeksan label

misalnya bayangkan skenario ini

In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[] hanya mengiris baris (berdasarkan lokasi label)

Jeff
sumber
7
Bagaimana jika Anda menginginkan baris kedua dan ketiga?
FaCoffee
1
Anda dapat dengan mudah melewati daftar pengindeks; dokumen ditunjukkan di atas
Jeff
2
Apakah ada yang punya pembenaran untuk nama-nama ini? Saya menemukan ini sulit untuk diingat karena saya tidak yakin mengapa ilocbaris dan loclabel.
kilojoules
3
@kilojoules .ilocmencari hal berdasarkan pesanan mereka dalam indeks (mis. .iloc[[2]]) adalah "baris" kedua di df. Baris itu berada di lokasi indeks4 . .locmencari mereka berdasarkan nilai indeks mereka. Jadi mungkin "iloc" sama seperti "i" A[i]? :)
Jim K.
1
@ Jeff - ini berfungsi dengan baik, tetapi apa yang terjadi ketika Anda ingin menduplikasi baris dari bingkai data Anda, seperti df.loc[-1] = df.iloc[[0]], dan masukkan itu? Bingkai dilengkapi dengan kolom indeks tambahan yang memberikan kesalahan ValueError: cannot set a row with mismatched columns (lihat stackoverflow.com/questions/47340571/… )
Growler
63

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 integer 2. Kolom ini tidak ada dan KeyErrordinaikkan.


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.

df[2:3]

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.

df[6:20:3]

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.

Ted Petrou
sumber
Mencoba menambahkan baris ke kerangka data lain menggunakan operator indxeing tetapi kerangka data lainnya tetap kosong. Mengapa?
FindOutIslamNow
23

Anda dapat menganggap DataFrame sebagai diktator Seri. df[key]coba pilih indeks kolom dengan keydan 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

HYRY
sumber
Terima kasih atas petunjuknya. Lucu, hal semacam ini masih menjadi pertanyaan panda. Menambahkan pengecualian pada perilaku dalam situasi tertentu, ... bagi saya rasanya mengorbankan konsistensi untuk sedikit kenyamanan.
Carl Berger
15

Untuk akses berbasis indeks ke tabel panda, kita juga dapat mempertimbangkan opsi numpy.as_array untuk mengonversi tabel ke array Numpy sebagai

np_df = df.as_matrix()

lalu

np_df[i] 

akan bekerja.

Pavel Prochazka
sumber
11
yang mengalahkan seluruh tujuan indeks dataframe dan segala sesuatu yang ditawarkan panda lainnya
Fábio Dias
6

Anda dapat melihat kode sumbernya .

DataFramememiliki fungsi pribadi _slice()untuk mengiris DataFrame, dan memungkinkan parameter axisuntuk menentukan sumbu mana yang akan diiris. The __getitem__()untuk DataFrametidak menetapkan sumbu sementara memohon _slice(). Jadi _slice()iris secara default sumbu 0.

Anda dapat mengambil percobaan sederhana, yang mungkin membantu Anda:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)
waitingkuo
sumber
5

Anda dapat mengulang melalui bingkai data seperti ini.

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
pengguna1401491
sumber