Saya sangat bingung dengan metode pengindeksan yang berbeda menggunakan iloc
di panda.
Katakanlah saya sedang mencoba mengubah 1-d Dataframe menjadi 2-d Dataframe. Pertama saya memiliki Dataframe 1-d berikut
a_array = [1,2,3,4,5,6,7,8]
a_df = pd.DataFrame(a_array).T
Dan saya akan mengubahnya menjadi 2-d Dataframe dengan ukuran 2x4
. Saya mulai dengan menetapkan 2-d Dataframe sebagai berikut:
b_df = pd.DataFrame(columns=range(4),index=range(2))
Kemudian saya menggunakan for-loop untuk membantu saya mengkonversi a_df
(1-d) ke b_df
(2-d) dengan kode berikut
for i in range(2):
b_df.iloc[i,:] = a_df.iloc[0,i*4:(i+1)*4]
Itu hanya memberi saya hasil berikut
0 1 2 3
0 1 2 3 4
1 NaN NaN NaN NaN
Tetapi ketika saya berubah b_df.iloc[i,:]
menjadi b_df.iloc[i][:]
. Hasilnya benar seperti berikut, yang saya inginkan
0 1 2 3
0 1 2 3 4
1 5 6 7 8
Adakah yang bisa menjelaskan kepada saya apa perbedaan antara .iloc[i,:]
dan .iloc[i][:]
adalah, dan mengapa .iloc[i][:]
bekerja dalam contoh saya di atas tetapi tidak.iloc[i,:]
b_df.iloc[1] = a_df.iloc[0, 4:8]
menetapkan seri dengan indeks[4, 5, 6, 7]
ke seri dengan indeks[0, 1, 2, 3]
. Tidak ada tumpang tindih jadiNaN
ditugaskan untuk semua elemen. Sampai pada titik ini masuk akal bagi saya. Tetapi seperti Anda, saya tidak jelas mengapab_df.iloc[1][:] = ...
berperilaku berbeda — memeriksa objekb_df.iloc[1]
danb_df.iloc[1][:]
tidak menunjukkan perbedaan di antara indeks. Tebakan terbaik saya adalah bahwa menetapkan langsung ke salinan ([:]
) diperlakukan sebagai kasus khusus oleh Pandas yang membuatnya mengabaikan indeks penerima dan membuat perbedaan ini.