Estou tão confuso com diferentes métodos de indexação usando iloc
em pandas.
Digamos que estou tentando converter um Dataframe 1-d para um Dataframe 2-d. Primeiro, tenho o seguinte Dataframe 1-d
a_array = [1,2,3,4,5,6,7,8]
a_df = pd.DataFrame(a_array).T
E eu vou converter isso em um Dataframe 2D com o tamanho de 2x4
. Começo predefinindo o Dataframe 2-d da seguinte maneira:
b_df = pd.DataFrame(columns=range(4),index=range(2))
Então eu uso o loop for para me ajudar a converter a_df
(1-d) emb_df
(2-d) com o seguinte código
for i in range(2):
b_df.iloc[i,:] = a_df.iloc[0,i*4:(i+1)*4]
Apenas me fornece os seguintes resultados
0 1 2 3
0 1 2 3 4
1 NaN NaN NaN NaN
Mas quando mudei b_df.iloc[i,:]
parab_df.iloc[i][:]
. O resultado está correto como o seguinte, que é o que eu quero
0 1 2 3
0 1 2 3 4
1 5 6 7 8
Alguém poderia me explicar qual é a diferença entre .iloc[i,:]
e .iloc[i][:]
é e por que .iloc[i][:]
funcionou no meu exemplo acima, mas não.iloc[i,:]
b_df.iloc[1] = a_df.iloc[0, 4:8]
atribui uma série com índice[4, 5, 6, 7]
a uma série com índice[0, 1, 2, 3]
. Não há sobreposição, portanto,NaN
é atribuído a todos os elementos. Até este ponto, faz sentido para mim. Mas, como você, não sei por queb_df.iloc[1][:] = ...
se comporta de maneira diferente - inspecionando os objetosb_df.iloc[1]
eb_df.iloc[1][:]
não revela diferença entre os índices. Meu melhor palpite seria que atribuir diretamente a uma cópia ([:]
) é tratado como um caso especial pelo Pandas, o que faz com que ignore o índice do responsável e crie essa discrepância.