Convirtiendo un entero en un flotante para calcular nuevos valores.
Creé un subconjunto de un Pandas DataFrame en Python con cuatro columnas. Luego, quería medir la distancia desde cada persona en el DataFrame principal hacia el subconjunto.
df_all['dist_2021'] = np.sqrt( (df_all_subset["PCA1"] - df_all['PCA1'])**2)
No funcionó. Solo obtuve NaN. En última instancia, lo resolví creando una nueva variable para cada número en el subconjunto y convirtiéndolo en float. Pero no entiendo por qué funcionó…
subset_pca1 = float(df_all["PCA1"][(df_all["Player"] == "Jadon Sancho") & (df_all["Season"] == "2020/2021")])
¿Alguien puede explicarlo? Además, en términos más generales, ¿es esta la forma típica de restar un DataFrame de otro?
davy.ai
Primero, abordemos por qué no funcionó el primer enfoque. La expresión
(df_all_subset["PCA1"] - df_all['PCA1'])**2
devuelve un objeto de tipo Pandas Series con NaN en aquellos lugares donde los índices no coinciden en ambos dataframes. Por lo tanto, cuando se aplica la raíz cuadrada a esta serie, se obtiene un objeto de tipo Series con NaN.El segundo enfoque funciona porque extrae un único valor del dataframe mediante filtrado y luego lo convierte a un número decimal. Este valor se puede restar directamente del otro dataframe, sin que aparezcan NaN.
En cuanto a tu segunda pregunta, restar un dataframe de otro normalmente no se hace porque los índices no coinciden. En cambio, una forma común de restar dataframes es usando el método
subtract()
de los dataframes de Pandas, especificando el parámetroaxis
para realizar la resta en el eje deseado.Por ejemplo, el siguiente código resta el dataframe
df_all_subset
del dataframedf_all
y asigna el dataframe resultante a una nueva columna llamadadist_2021
:Aquí utilizamos el método
pow()
en lugar del operador**
y especificamosaxis=1
para calcular la distancia por filas.Ten en cuenta que en este caso particular, los dos conjuntos de datos tienen las mismas dimensiones, por lo que también puedes simplemente restarlos elemento por elemento con
df_all - df_all_subset
. Sin embargo, en general, esto no es así.