Мене так плутають різні методи індексації, які використовуються ilocв пандах.
Скажімо, я намагаюся перетворити 1-d Dataframe у 2-d Dataframe. По-перше, у мене є наступний 1-d Dataframe
a_array = [1,2,3,4,5,6,7,8]
a_df = pd.DataFrame(a_array).T
І я збираюсь перетворити це у 2-денний Dataframe розміром 2x4. Почніть із попереднього встановлення 2-денного фрейму даних наступним чином:
b_df = pd.DataFrame(columns=range(4),index=range(2))
Тоді я використовую for-loop, щоб допомогти мені перетворити a_df(1-d) в b_df(2-d) із наступним кодом
for i in range(2):
b_df.iloc[i,:] = a_df.iloc[0,i*4:(i+1)*4]
Це дає мені лише такі результати
0 1 2 3
0 1 2 3 4
1 NaN NaN NaN NaN
Але коли я змінився b_df.iloc[i,:]на b_df.iloc[i][:]. Результат правильний, як наступний, що я хочу
0 1 2 3
0 1 2 3 4
1 5 6 7 8
Може хто - небудь пояснити мені , в чому різниця між .iloc[i,:]і .iloc[i][:], і чому .iloc[i][:]працював в моєму прикладі вище , але не.iloc[i,:]
b_df.iloc[1] = a_df.iloc[0, 4:8]присвоює серію з індексом[4, 5, 6, 7]ряду з індексом[0, 1, 2, 3]. Перекриття немає, томуNaNприсвоюємо всі елементи. До цього моменту це має сенс для мене. Але, як і ви, мені незрозуміло, чомуb_df.iloc[1][:] = ...поводиться по-різному - оглядаючи об'єктиb_df.iloc[1]таb_df.iloc[1][:]не виявляючи різниці між показниками. Моя найкраща здогадка - це те, що присвоєння безпосередньо копії ([:]) Pandas трактується як особливий випадок, що змушує ігнорувати індекс одержувача і створювати цю невідповідність.