Tengo un marco de datos:
| nombre | años | |
|---|---|---|
| 0 | Pablo | 25 |
| 1 | Juan | 27 |
| 2 | Cuenta | 23 |
Sé que si entro:
df[['name']] = df[['age']]
Obtendré lo siguiente:
| nombre | años | |
|---|---|---|
| 0 | 25 | 25 |
| 1 | 27 | 27 |
| 2 | 23 | 23 |
Pero espero el mismo resultado del comando:
df.loc[:, ['name']] = df.loc[:, ['age']]
Pero en cambio, me sale esto:
| nombre | años | |
|---|---|---|
| 0 | Yaya | 25 |
| 1 | Yaya | 27 |
| 2 | Yaya | 23 |
Por alguna razón, si omito esos corchetes [] alrededor de los nombres de las columnas, obtendré exactamente lo que esperaba. Ese es el comando:
df.loc[:, 'name'] = df.loc[:, 'age']
da el resultado correcto:
| nombre | años | |
|---|---|---|
| 0 | 25 | 25 |
| 1 | 27 | 27 |
| 2 | 23 | 23 |
¿Por qué dos pares de corchetes con .loc dan como resultado NaN? ¿Es algún tipo de error o es un comportamiento intencionado? No puedo entender la razón de tal comportamiento.
Esto se debe a que, para la asignación de loc , todos los ejes de índice están alineados, incluidas las columnas: dado que la age y el name no coinciden, no hay datos para asignar, de ahí los NaN.
Puede hacer que funcione cambiando el nombre de las columnas:
df.loc[:, ["name"]] = df.loc[:, ["age"]].rename(columns={"age": "name"})o accediendo a la matriz numpy:
df.loc[:, ["name"]] = df.loc[:, ["age"]].valuesCuando usa corchetes dobles [[]], está asignando un DataFrame. Lo que quiere es asignar una Serie (columna), y para eso usa solo un corchete [].
Aquí hay algo de código:
import pandas as pd df = pd.DataFrame({'name':['Paul','John','Bill'], 'age':[25,27,23]}) print('Inital Dataframe:\n',df) df[['name']] = df[['age']] print("\ndf[['name']] = df[['age']]\n",df) print("df.loc[:, ['age']]:", type(df.loc[:, ['age']])) print("df.loc[:, ['name']]:", type(df.loc[:, ['name']])) df.loc[:, ['name']] = df.loc[:, ['age']] print("\ndf.loc[:, ['name']] = df.loc[:, ['age']]\n",df) print('=======================') df = pd.DataFrame({'name':['Paul','John','Bill'], 'age':[25,27,23]}) print('Inital Dataframe:\n',df) print("type(df.loc[:, 'age']):", type(df.loc[:, 'age'])) print("type(df.loc[:, 'name']):", type(df.loc[:, 'name'])) df.loc[:, 'name'] = df.loc[:, 'age'] print("\ndf.loc[:, 'name'] = df.loc[:, 'age']\n",df)Y la salida:
Inital Dataframe: name age 0 Paul 25 1 John 27 2 Bill 23 df[['name']] = df[['age']] name age 0 25 25 1 27 27 2 23 23 df.loc[:, ['age']]: <class 'pandas.core.frame.DataFrame'> df.loc[:, ['name']]: <class 'pandas.core.frame.DataFrame'> df.loc[:, ['name']] = df.loc[:, ['age']] name age 0 NaN 25.0 1 NaN 27.0 2 NaN 23.0 ======================= Inital Dataframe: name age 0 Paul 25 1 John 27 2 Bill 23 type(df.loc[:, 'age']): <class 'pandas.core.series.Series'> type(df.loc[:, 'name']): <class 'pandas.core.series.Series'> df.loc[:, 'name'] = df.loc[:, 'age'] name age 0 25 25 1 27 27 2 23 23 Sin embargo, aquí hay otro comportamiento extraño: ¡Asignar los corchetes dobles a las variables de diferencia, digamos df1 y df2 , y luego df1 = df2 funciona! Aquí hay algo más de código:
df = pd.DataFrame({'name':['Paul','John','Bill'], 'age':[25,27,23]}) print('Inital Dataframe:\n',df) df1 = df.loc[:, ['name']] df2 = df.loc[:, ['age']] print("\ndf1 = df.loc[:, ['name']]\n",df1) print("\ndf2 = df.loc[:, ['age']]\n",df2) df1=df2 print("\ndf1=df2\ndf1:\n",df1)Y la salida:
Inital Dataframe: name age 0 Paul 25 1 John 27 2 Bill 23 df1 = df.loc[:, ['name']] name 0 Paul 1 John 2 Bill df2 = df.loc[:, ['age']] age 0 25 1 27 2 23 df1=df2 df1: age 0 25 1 27 2 23