40 votes

Pandas slicing FutureWarning avec 0.21.0

J'essaie de sélectionner un sous-ensemble d'un sous-ensemble d'un cadre de données, en ne sélectionnant que certaines colonnes, et en filtrant sur les lignes.

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

Cependant, j'obtiens l'erreur suivante :

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

Quelle est la manière correcte de découper et de filtrer maintenant ?

5 votes

Ce n'est pas une erreur, c'est une avertissement . Mais ce qu'il vous dit, c'est que l'une de vos étiquettes, probablement celle de votre colonne, n'est pas contenue dans le cadre de données. Le comportement actuel sera d'échouer silencieusement et de retourner une colonne avec NaN s. À l'avenir, il soulèvera une erreur à la place.

0 votes

Merci, j'avais mal compris ce que signifiait index - et en quoi la réindexation était pertinente. Oui, j'ai juste fait une faute de frappe dans une de mes étiquettes.

1 votes

Oui, je suis d'accord que la partie sur .reindex() est déroutant. EDIT bien que cela ait un sens quand vous lisez ce

41voto

coldspeed Points 111053

TL;DR : Il y a probablement une faute de frappe ou d'orthographe dans les noms d'en-tête de colonne.

Il s'agit d'une modification introduite dans v0.21.1 et a été expliqué dans le docs longuement -

Auparavant, la sélection avec une liste d'étiquettes, où une ou plusieurs étiquettes étaient manquantes, la sélection réussissait toujours, renvoyant NaN pour les étiquettes manquantes. Cela montrera maintenant un FutureWarning . A l'avenir, cela soulèvera un KeyError ( GH15747 ). Cet avertissement se déclenchera sur un DataFrame ou un Series pour avoir utilisé .loc[] o [[]] lors du passage d'une liste de labels avec at au moins une étiquette manquante.

Par exemple,

df

     A    B  C
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

Essayez une sorte de découpage en tranches comme vous le faites -

df.loc[df.A.gt(6), ['A', 'C']]

     A  C
0  7.0  8
2  8.0  7
4  8.0  7

Aucun problème. Maintenant, essayez de remplacer C avec une étiquette de colonne inexistante -

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.

     A   D
0  7.0 NaN
2  8.0 NaN
4  8.0 NaN

Donc, dans votre cas, l'erreur est due aux étiquettes de colonne que vous passez à loc . Regardez-les à nouveau.

2 votes

Et si je veulent a KeyError à signaler s'il manque des étiquettes ? C'est-à-dire que si je veulent le nouveau comportement ? En ce moment même .loc[list_of_names] donnera cet avertissement, que je ne veux pas voir. Y a-t-il un moyen de le désactiver ?

0 votes

@OrenBen-Kiki Le moyen le plus simple est de mettre à jour vers la dernière version, il jette une KeyError dans les dernières versions.

1 votes

Oui, mais il donne aussi l'avertissement... Actuellement, mes choix sont d'utiliser reindex (et perdre la sécurité que loc me donne), ou utiliser loc et recevoir une tonne d'avertissements. Existe-t-il une troisième option (obtenir la sécurité et les avertissements) ? no obtenir les avertissements) ?

2voto

ShitalShah Points 2213

Cette erreur se produit également avec .append lorsque la liste contient de nouvelles colonnes. Pour éviter ce

Utilisez :

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

Au lieu de,

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

Message d'erreur complet :

C:\ProgramData\Anaconda3\lib\site -packages \pandas\core\indexing.py :1472 : FutureWarning : Passage des listes d'amis en .loc ou avec tout label manquant manquant entraînera une KeyError dans le futur, vous pouvez utiliser .reindex() comme alternative.

Merci à https://stackoverflow.com/a/50230080/207661

1 votes

De la même manière, si vous devez ajouter deux cadres de données, vous pouvez utiliser df = df.append(pd.DataFrame([dict]), ignore_index=True)

0 votes

Comme l'indique le titre de la question, il s'agit d'un avertissement et non d'une erreur.

1voto

Si vous voulez conserver l'index, vous pouvez passer une compréhension de liste au lieu d'une liste de colonnes :

loan_data_inputs_train.loc[:,[i for i in List_col_without_reference_cat]]

-1voto

Max Vinogradov Points 170

Désolé, je ne suis pas sûr d'avoir bien compris, mais il semble que la prochaine voie pourrait être acceptable pour vous :

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

Description du snippet :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X