Actualizando una fila de Pandas DataFrame con un diccionario

He encontrado un comportamiento en pandas DataFrames que no entiendo.

df = pd.DataFrame(np.random.randint(1, 10, (3, 3)), index=['one', 'one', 'two'], columns=['col1', 'col2', 'col3']) new_data = pd.Series({'col1': 'new', 'col2': 'new', 'col3': 'new'}) df.iloc[0] = new_data # resulting df looks like: # col1 col2 col3 #one new new new #one 9 6 1 #two 8 3 7 

Pero si bash agregar un diccionario, obtengo esto:

 new_data = {'col1': 'new', 'col2': 'new', 'col3': 'new'} df.iloc[0] = new_data # # col1 col2 col3 #one col2 col3 col1 #one 2 1 7 #two 5 8 6 

¿Por qué está pasando esto? En el proceso de escribir esta pregunta, me di cuenta de que lo más probable es que df.loc solo tome las claves de new_data, lo que también explica por qué los valores están fuera de orden. Pero, de nuevo, ¿por qué es este el caso? Si bash crear un DataFrame a partir de un diccionario, maneja las claves como si fueran columnas:

 pd.DataFrame([new_data]) # col1 col2 col3 #0 new new new 

¿Por qué no es el comportamiento predeterminado en df.loc?

Es la diferencia entre cómo se itera un diccionario y cómo se trata una serie de pandas.

Una serie de pandas hace coincidir su índice con las columnas cuando se asigna a una fila y coincide con el índice si se asigna a una columna. Después de eso, asigna el valor que corresponde a ese índice o columna coincidente.

Cuando un objeto no es un objeto de pandas con un objeto de índice conveniente para hacer coincidir, los pandas recorrerán el objeto. Un diccionario itera a través de sus claves y es por eso que ve las claves del diccionario en las ranuras de esas filas. Los diccionarios no están ordenados y es por eso que ves las teclas barajadas en esa fila.