Pandas rebanando FutureWarning con 0.21.0

Estoy tratando de seleccionar un subconjunto de un subconjunto de un dataframe, seleccionando solo algunas columnas y filtrando en las filas.

df.loc[df.a.isin(['Apple', 'Pear', 'Mango']), ['a', 'b', 'f', 'g']] 

Sin embargo, estoy recibiendo el error:

 Passing list-likes to .loc or [] with any missing label will raise KeyError in the future, you can use .reindex() as an alternative. 

¿Cuál es la forma correcta de cortar y filtrar ahora?

Este es un cambio introducido en v0.21.1 , y se ha explicado en la documentación en detalle –

Anteriormente, la selección con una lista de tags, donde faltaban una o más tags, siempre tendría éxito, devolviendo NaN a las tags que faltaban. Esto ahora mostrará un FutureWarning . En el futuro, esto generará un KeyError ( GH15747 ). Esta advertencia se activará en un DataFrame o una Series para usar .loc[] o [[]] al pasar una lista de tags con al menos 1 etiqueta faltante.

Por ejemplo,

 df ABC 0 7.0 NaN 8 1 3.0 3.0 5 2 8.0 1.0 7 3 NaN 0.0 3 4 8.0 2.0 7 

Prueba algún tipo de corte mientras lo haces.

 df.loc[df.A.gt(6), ['A', 'C']] AC 0 7.0 8 2 8.0 7 4 8.0 7 

No hay problema. Ahora, intente reemplazar C con una etiqueta de columna inexistente –

 df.loc[df.A.gt(6), ['A', 'D']] FutureWarning: Passing list-likes to .loc or [] with any missing label will raise KeyError in the future, you can use .reindex() as an alternative. AD 0 7.0 NaN 2 8.0 NaN 4 8.0 NaN 

Por lo tanto, en su caso, el error se debe a las tags de las columnas que pasa a loc . Echa un vistazo a ellos.

Este error también se produce con la llamada .append cuando la lista contiene nuevas columnas. Para evitar esto

Utilizar:

 df=df.append(pd.Series({'A':i,'M':j}), ignore_index=True) 

En lugar de,

 df=df.append([{'A':i,'M':j}], ignore_index=True) 

Mensaje de error completo:

C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ core \ indexing.py: 1472: FutureWarning: Pasar listas-me gusta a .loc o con cualquier etiqueta faltante boostá KeyError en el futuro, puede usar .reindex ( ) como alternativa.

Gracias a https://stackoverflow.com/a/50230080/207661

Lo siento, no estoy seguro de haberlo entendido correctamente, pero parece que la siguiente forma podría ser aceptable para usted:

df[df['a'].isin(['Apple', 'Pear', 'Mango'])][['a', 'b', 'f', 'g']]

Descripción del fragmento:

 df['a'].isin(['Apple', 'Pear', 'Mango']) # it's "filter" by data in each row in column *a* df[['a', 'b', 'f', 'g']] # it's "column filter" that provide ability select specific columns set