Pengindeksan Panda dan kesalahan Kunci

Pertimbangkan hal berikut:

d = {'a': 0.0, 'b': 1.0, 'c': 2.0}

e = pd.Series(d, index = ['a', 'b', 'c'])

df = pd.DataFrame({ 'A' : 1.,'B' : e,'C' :pd.Timestamp('20130102')}).

Ketika saya mencoba mengakses baris pertama kolom B dengan cara berikut:

>>> df.B[0]
0.0

Saya mendapatkan hasil yang benar.

Namun, setelah membaca KeyError: 0 saat mengakses nilai dalam seri pandas, saya berasumsi bahwa, karena saya telah menetapkan indeks sebagai 'a', 'b' dan 'c', cara yang benar untuk mengakses baris pertama kolom B (menggunakan argumen posisi) adalah: df.B.iloc[0] , dan df.B[0] harus memunculkan Kesalahan Kunci. Saya tidak tahu apa yang saya lewatkan. Dapatkah seseorang menjelaskan dalam hal apa saya mendapatkan Kesalahan Kunci?


person Yash    schedule 20.07.2018    source sumber
comment
Anda harus menggunakan loc atau at. Lihat info selengkapnya di stackoverflow.com/questions/48035493/.   -  person cs95    schedule 20.07.2018


Jawaban (3)


Masalah dalam Pertanyaan referensi Anda adalah indeks kerangka data yang diberikan adalah bilangan bulat, tetapi tidak dimulai dari 0.

Perilaku Panda saat menanyakan df.B[0] bersifat ambigu dan bergantung pada tipe data indeks dan tipe data nilai yang diteruskan ke sintaksis irisan python. Itu bisa berperilaku seperti df.B.loc[0] (berdasarkan label indeks) atau df.B.iloc[0] (berdasarkan posisi) atau mungkin hal lain yang tidak saya sadari. Untuk perilaku yang dapat diprediksi, saya sarankan menggunakan loc dan iloc.

Untuk mengilustrasikannya dengan contoh Anda:

d = [0.0, 1.0, 2.0]
e = pd.Series(d, index = ['a', 'b', 'c'])
df = pd.DataFrame({'A': 1., 'B': e, 'C': pd.Timestamp('20130102')})

df.B[0] # 0.0 - fall back to position based
df.B['0'] # KeyError - no label '0' in index
df.B['a'] # 0.0 - found label 'a' in index
df.B.loc[0] # TypeError - string index queried by integer value
df.B.loc['0'] # KeyError - no label '0' in index
df.B.loc['a'] # 0.0 - found label 'a' in index
df.B.iloc[0] # 0.0 - position based query for row 0
df.B.iloc['0'] # TypeError - string can't be used for position
df.B.iloc['a'] # TypeError - string can't be used for position

Dengan contoh dari artikel referensi:

d = [0.0, 1.0, 2.0]
e = pd.Series(d, index = [4, 5, 6])
df = pd.DataFrame({'A': 1., 'B': e, 'C': pd.Timestamp('20130102')})

df.B[0] # KeyError - label 0 not in index
df.B['0'] # KeyError - label '0' not in index
df.B.loc[0] # KeyError - label 0 not in index
df.B.loc['0'] # KeyError - label '0' not in index
df.B.iloc[0] # 0.0 - position based query for row 0
df.B.iloc['0'] # TypeError - string can't be used for position
person Justinas Marozas    schedule 20.07.2018

df.B mengembalikan seri pandas itulah sebabnya Anda dapat melakukan pengindeksan posisi. Jika Anda memilih kolom B sebagai kerangka data, ini akan menimbulkan kesalahan:

df[['B']][0]
person xyzjayne    schedule 20.07.2018

df.B sebenarnya adalah objek pandas.Series (pintasan untuk df['B']), yang dapat diulang. df.B[0] bukan lagi sebuah "baris" tetapi hanya elemen pertama dari df.B, karena dengan menulis df.B pada dasarnya Anda membuat objek 1-D.

Informasi selengkapnya di dokumentasi struktur data

Anda dapat memperlakukan DataFrame secara semantik seperti dict objek Seri yang diindeks serupa.

person NiGiord    schedule 20.07.2018
comment
Ya, elemen rangkaian pandas dapat diperoleh dengan pengindeksan langsung. - person Rohith; 20.07.2018