Мене так плутають різні методи індексації, які використовуються 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 трактується як особливий випадок, що змушує ігнорувати індекс одержувача і створювати цю невідповідність.