web-dev-qa-db-ja.com

Pandas FutureWarningを0.21.0でスライスする

データフレームのサブセットのサブセットを選択し、一部の列のみを選択し、行をフィルタリングしようとしています。

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

しかし、私はエラーが発生しています:

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

今すぐスライスしてフィルタリングする正しい方法は何ですか?

27
QuinRiva

これはv0.21.1で導入された変更で、 docs で説明されています-

以前は、1つまたは複数のラベルが欠落していたラベルのリストを使用して選択すると、常に成功し、欠落したラベルに対してNaNが返されました。これでFutureWarningが表示されます。将来、これはKeyErrorGH15747 )を発生させます。この警告は、少なくとも1つのラベルが欠落しているラベルのリストを渡すときに、.loc[]または[[]]を使用するDataFrameまたはSeriesでトリガーされます。

例えば、

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

あなたがやっているように、ある種のスライスを試してください-

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

     A  C
0  7.0  8
2  8.0  7
4  8.0  7

問題ない。次に、Cを存在しない列ラベルに置き換えてみてください-

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

したがって、あなたの場合、エラーはlocに渡す列ラベルが原因です。それらをもう一度見てみましょう。

27
cs95

このエラーは、リストに新しい列が含まれるときに.append呼び出しでも発生します。これを避けるために

つかいます:

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

の代わりに、

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

完全なエラーメッセージ:

C:\ ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py:1472:FutureWarning:.likeに.likeまたは欠落しているラベルを渡すと、将来KeyErrorが発生します。reindex( )代替として。

https://stackoverflow.com/a/50230080/207661 に感謝

1
Shital Shah