Estoy muy confundido con los diferentes métodos de indexación que se usan iloc
en los pandas.
Digamos que estoy tratando de convertir un Dataframe 1-d en un Dataframe 2-d. Primero tengo el siguiente marco de datos 1-d
a_array = [1,2,3,4,5,6,7,8]
a_df = pd.DataFrame(a_array).T
Y voy a convertir eso en un Dataframe 2-d con el tamaño de 2x4
. Comienzo preseleccionando el Dataframe 2-d de la siguiente manera:
b_df = pd.DataFrame(columns=range(4),index=range(2))
Luego uso for-loop para ayudarme a convertir a_df
(1-d) a b_df
(2-d) con el siguiente código
for i in range(2):
b_df.iloc[i,:] = a_df.iloc[0,i*4:(i+1)*4]
Solo me da los siguientes resultados
0 1 2 3
0 1 2 3 4
1 NaN NaN NaN NaN
Pero cuando me cambié b_df.iloc[i,:]
a b_df.iloc[i][:]
. El resultado es correcto como el siguiente, que es lo que quiero
0 1 2 3
0 1 2 3 4
1 5 6 7 8
¿Alguien podría explicarme cuál es la diferencia entre .iloc[i,:]
y .iloc[i][:]
, y por qué .iloc[i][:]
funcionó en mi ejemplo anterior pero no.iloc[i,:]
b_df.iloc[1] = a_df.iloc[0, 4:8]
asigna una serie con índice[4, 5, 6, 7]
a una serie con índice[0, 1, 2, 3]
. No hay superposición, por lo queNaN
se asignan a todos los elementos. Hasta este punto tiene sentido para mí. Pero, como usted, no tengo claro por qué seb_df.iloc[1][:] = ...
comporta de manera diferente: inspeccionar los objetosb_df.iloc[1]
yb_df.iloc[1][:]
no revela diferencias entre los índices. Mi mejor conjetura sería que la asignación directa a una copia ([:]
) es tratada como un caso especial por Pandas, lo que hace que ignore el índice del cesionario y cree esta discrepancia.