Панды нарезки 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.

Какой правильный способ отрезать и фильтровать сейчас?

Ответ 1

Это изменение, внесенное в v0.21.1, и было v0.21.1 объяснено в документах -

Раньше выбор со списком меток, где отсутствовала одна или несколько ярлыков, всегда была бы успешной, возвращая NaN для отсутствующих меток. Теперь будет показано FutureWarning. В будущем это повысит KeyError (GH15747). Это предупреждение будет запускаться на DataFrame или Series для использования .loc[] или [[]] при передаче списка меток с по меньшей мере 1 отсутствующей меткой.

Например,

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. Взгляните на них еще раз.

Ответ 2

Извините, я не уверен, что я правильно вас понял, но кажется, что следующий путь может быть приемлемым для вас:

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

Описание фрагмента:

df['a'].isin(['Apple', 'Pear', 'Mango']) # it "filter" by data in each row in column *a*

df[['a', 'b', 'f', 'g']] # it "column filter" that provide ability select specific columns set