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