Панд нарезка предупреждение с 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.

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

2 ответов


это изменение введено в v0.21.1, и пояснил, в docs на расстояние -

ранее выбор со списком меток, где одна или несколько меток отсутствующие всегда преуспевали, возвращаясь NaN для отсутствующих этикеток. Теперь это покажет FutureWarning. В будущем это позволит поднять KeyError ( GH15747). Это предупреждение будет срабатывать на DataFrame или a Series использовать .loc[] или [[]] когда передача списка меток с помощью at минимум 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. Взгляните на них еще раз.


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

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

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

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