Панд нарезка предупреждение с 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
или aSeries
использовать.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