es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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ámetro axis para realizar la resta en el eje deseado.

    Por ejemplo, el siguiente código resta el dataframe df_all_subset del dataframe df_all y asigna el dataframe resultante a una nueva columna llamada dist_2021:

    df_all['dist_2021'] = df_all[['PCA1', 'PCA2', 'PCA3', 'PCA4']].subtract(df_all_subset).pow(2).sum(axis=1).pow(0.5)
    

    Aquí utilizamos el método pow() en lugar del operador ** y especificamos axis=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í.

Comments are closed.