No entiendo por qué esto funciona

df[(df['Gold']>0) & (df['Gold.1']>0)].loc[((df['Gold'] - df['Gold.1'])/(df['Gold'])).abs().idxmax()]

pero cuando voy a dividir por (df['Gold'] + df['Gold.1'] + df['Gold.2'])
deja de funcionar me da error de que usted puede encontrar a continuación.

Curiosamente, la siguiente línea de obras

df.loc[((df['Gold'] - df['Gold.1'])/(df['Gold'] + df['Gold.1'] + df['Gold.2'])).abs().idxmax()]

No entiendo lo que está pasando ya que acabo de empezar a aprender Python y Pandas. Necesito entender la razón de por qué sucede esto y cómo solucionarlo.

ERROR

KeyError: ‘la etiqueta [Argelia] no está en el [índice]’

DataFrame complemento
Python (Pandas) 'error de la etiqueta [Argelia] no está en el [índice]'

  • Trate de print(df.index.tolist()), usted podría tener algunos espacios en allí.
  • en el futuro, por favor enviar un texto de ejemplo de su dataframe, de manera que podemos jugar con ella (o el código para producirlo), no una imagen. Consulte Cómo hacer una buena reproducible pandas ejemplos por ejemplo. Gracias, y buena suerte con tu curso 😉
  • La muestra dataframe no ayuda mucho, porque el Invierno medalla de cuenta (Gold.1,Silver.1,Bronze.1,Total.1)) para todos los países son todos cero. Por la manera en que tendría el nombre de quienes serie Gold.S, Gold.W, Gold sólo para ser claros.
  • Si después nos reproducible código y un conjunto de datos (o URL), se podría responder. Es una buena pregunta para la práctica de un buen lenguaje en. La causa de su fallo es «multiindexing», es decir, df[...][...] resultará en el lado izquierdo de la expresión dar una copia, que el lado derecho de la expresión, a continuación, intenta procesar o modificar, en lugar de trabajar directamente sobre el origen del df. df.filter podría ser una mejor manera de ir…
InformationsquelleAutor YohanRoth | 2017-01-02

1 Comentario

  1. 6

    Su problema es booleano indexación:

    df[(df['Gold']>0) & (df['Gold.1']>0)]

    devuelve un filtrado DataFrame que no contiene la index de max valor de Series se calcula con esto:

    ((df['Gold'] - df['Gold.1'])/(df['Gold'] + df['Gold.1'] + df['Gold.2'])).abs().idxmax()

    De sus datos es Algeria.

    Así loc lógicamente lanza una KeyError.

    Una posible solución es asignar el nuevo filtrado DataFrame a df1 y, a continuación, obtener el índice correspondiente al valor máximo de Series mediante idxmax:

    df1 = df[(df['Gold']>0) & (df['Gold.1']>0)]
    df2 = df1.loc[((df1['Gold']-df1['Gold.1'])/(df1['Gold']+df1['Gold.1']+df1['Gold.2'])).abs().idxmax()]
    • Yo realmente no obtener este «retorno df que no contiene el índice del valor máximo de la Serie:» Así que usted está diciendo max valor no está en la trama de datos que se devuelve después de la operación booleana? Yo a pesar de que nos realice primero el filtro booleano, entonces en lo que se filtra encontramos el valor máx. No se cómo funciona?
    • No, porque a pesar de que el filtro se, no uso valores filtrados en ((df['Gold'] - df['Gold.1'])/(df['Gold'] + df['Gold.1'] + df['Gold.2'])).abs().idxmax() pero original sin filtrar. Por cierto, esto es muy duro, depuración de errores, porque a veces funciona muy bonito – si filtrada dataframe contiene idxmax, pero a veces es error si se cambian los valores. Si Algeria volver ((df['Gold'] - df['Gold.1'])/(df['Gold'] + df['Gold.1'] + df['Gold.2'])).abs().idxmax(), se puede ver Gold.1==0, por lo que no (df['Gold.1']>0)
    • hmm, gracias. Que es tan raro. Lo que es aún un punto para permitir la escritura como este, cuando lo trae errores sutiles y que no funciona de la forma esperada. Yo esperaba que se evalúan de izquierda a derecha. En lugar de eso funciona tan extrañamente 🙁 de todos Modos, gracias!
    • df.filter es probablemente una mejor manera de ir…

Dejar respuesta

Please enter your comment!
Please enter your name here