Я так запутался с различными методами индексации, используемыми ilocв пандах.
Допустим, я пытаюсь преобразовать 1-й Dataframe в 2-й Dataframe. Сначала у меня есть следующий 1-й 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, чтобы помочь мне преобразовать 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]. Нет перекрытия, поэтомуNaNs присваивается всем элементам. До этого момента это имеет смысл для меня. Но, как и вам, мне непонятно, почемуb_df.iloc[1][:] = ...ведет себя по-разному - проверяет объектыb_df.iloc[1]и неb_df.iloc[1][:]обнаруживает разницы между показателями. Моим лучшим предположением будет то, что назначение непосредственно copy ([:]) рассматривается Pandas как особый случай, который заставляет его игнорировать индекс правопреемника и создавать это несоответствие.