Использование или условие в маске dataframe панды [duplicate]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

58
задан Wojciech Walczak 23 March 2014 в 14:52
поделиться

3 ответа

Как вы можете видеть, оператор AND оставляет каждую строку, в которой по крайней мере одно значение равно -1. С другой стороны, оператор OR требует, чтобы оба значения были равны -1, чтобы отбросить их.

Правильно. Помните, что вы пишете условие с точки зрения того, что вы хотите сохранить , а не с точки зрения того, что вы хотите сбросить. Для df1:

df1 = df[(df.a != -1) & (df.b != -1)]

Вы говорите: «Сохраните строки, в которых df.a не является -1, а df.b не равно -1», что равнозначно удалению каждая строка, в которой хотя бы одно значение равно -1.

Для df2:

df2 = df[(df.a != -1) | (df.b != -1)]

Вы говорите: «Сохраните строки, в которых либо df.a, либо df.b не равно -1 ", что совпадает с удалением строк, где оба значения равны -1.

PS: скованный доступ, такой как df['a'][1] = -1, может вызвать у вас проблемы. Лучше привыкнуть к использованию .loc и .iloc.

85
ответ дан DSM 19 August 2018 в 04:45
поделиться
  • 1
    DataFrame.query() тоже неплохо работает. df.query('a != -1 or b != -1'). – Phillip Cloud 23 March 2014 в 17:34
  • 2
    Слушайте, чтобы узнать, почему панды хотят & и | через and и or? – stoves 31 January 2017 в 03:26
  • 3
    @stoves: в обычном коде Python and и or имеют базовую семантику Python, которые нельзя изменить. & и |, с другой стороны, имеют соответствующие специальные методы, которые контролируют их поведение. (В строках запроса, конечно, мы можем применять любой разбор, который нам нравится.) – DSM 31 January 2017 в 04:02
  • 4
    интересно, кажется, что df[True & False] терпит неудачу, но df[(True) & (False)] преуспевает (не тестируется в этом примере) – Mike Palmice 15 February 2018 в 21:26
  • 5
    – tommy.carstensen 31 August 2018 в 22:06

Вы можете использовать query () , т. е .:

df_filtered = df.query('a == 4 & b != 2')
22
ответ дан Pedro Lobito 19 August 2018 в 04:45
поделиться
0
ответ дан Jake 30 October 2018 в 16:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: