Estoy muy confundido con los diferentes métodos de indexación que se usan ilocen 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 queNaNse 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.