Python эквивалент вложенного условия if в Excel для фильтрации строк фрейма данных Pandas

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Выбор определенных строк Excel с использованием python. Итак, в Excel я бы сделал

 If(And(Or(A<>({"Closed",""}),Or(B<>({"Closed",""})))
  

Для получения тех столбцов во фрейме данных, которые не являются ни закрытыми, ни пустыми. Пробовал использовать

 df = df[(~df.A.isin([Closed","No Data"])) amp;(~df.B.isin([Closed","No Data"]))]
  

Проблема в том, что python удаляет столбцы, которые, например:

 A                        B
Approved       Closed
No Data          Restrict
Restrict           No Data
  

Чего я не хочу
Как было предложено в одной из ссылок, также опробовано

 df.loc[(df[A] != "Closed") amp; (df[B] != "Closed") amp; (df[A] != "No data") amp; (df[B] != "No data")
  

Получил тот же результат, что и при попытке.isin

Комментарии:

1. df = df[(~df.A.isin([Closed","No Data"])) |(~df.B.isin(["Closed","No Data"]))] ?

2. Большое спасибо, не могли бы вы, пожалуйста, помочь мне понять, почему это не работало.

Ответ №1:

Я буду использовать этот образец данных:

            A         B  ~df.A.isin  ~df.B.isin  ~A amp; ~B  ~A | ~B
0     Closed    Closed       False       False    False    False
1     Closed   No Data       False       False    False    False
2   Approved    Closed        True       False    False     True
3    No Data   No Data       False       False    False    False
4     Closed  Approved       False        True    False     True
5    No Data  Restrict       False        True    False     True
6   Approved   No Data        True       False    False     True
7     Closed  Restrict       False        True    False     True
8   Approved  Approved        True        True     True     True
9    No Data  Approved       False        True    False     True
10  Restrict   No Data        True       False    False     True
11  Restrict  Approved        True        True     True     True
  

~df.A.isin столбец показывает значение ~df.A.isin(["Closed","No Data"]) , которое является True для строк, где A не содержит ни Closed , ни No Data

~df.B.isin в столбце показано значение ~df.B.isin(["Closed","No Data"]) , которое является True для строк, где B не содержит ни Closed , ни No Data

~A amp; ~B в столбце показано значение (~df.A.isin(["Closed","No Data"])) amp;(~df.B.isin(["Closed","No Data"]))

~A | ~B в столбце показано значение (~df.A.isin(["Closed","No Data"])) |(~df.B.isin(["Closed","No Data"]))

При первой попытке не хватает " в начале Closed" . Добавив его, мы имеем

 df[(~df.A.isin(["Closed","No Data"])) amp;(~df.B.isin(["Closed","No Data"]))]
  

что дает нам:

            A         B  ~df.A.isin  ~df.B.isin  ~A amp; ~B  ~A | ~B
8   Approved  Approved        True        True     True     True
11  Restrict  Approved        True        True     True     True
  

Результат показывает только те строки, которые полностью без Closed и без No Data .

Предложение в комментариях Вен-Бена:

 df[(~df.A.isin(["Closed","No Data"])) |(~df.B.isin(["Closed","No Data"]))]
  

дает нам:

            A         B  ~df.A.isin  ~df.B.isin  ~A amp; ~B  ~A | ~B
2   Approved    Closed        True       False    False     True
4     Closed  Approved       False        True    False     True
5    No Data  Restrict       False        True    False     True
6   Approved   No Data        True       False    False     True
7     Closed  Restrict       False        True    False     True
8   Approved  Approved        True        True     True     True
9    No Data  Approved       False        True    False     True
10  Restrict   No Data        True       False    False     True
11  Restrict  Approved        True        True     True     True
  

Здесь мы имеем | ( or ) вместо amp; ( and ), поэтому строки могут содержать Closed или No Data , но не в обоих A и B. Это означает, что строки, которые имеют:

        A         B
Approved    Closed
 No Data  Restrict
Restrict   No Data
  

будут включены, но не будут строки, которые имеют:

      A         B
Closed    Closed
Closed   No Data
  

Ваша вторая попытка:

 df.loc[(df[A] != "Closed") amp; (df[B] != "Closed") amp;
       (df[A] != "No data") amp; (df[B] != "No data")
  

нужны кавычки вокруг меток столбцов. Вы можете использовать df.A или df['A'] , но не df[A]

Кроме того, вы написали data in No data со строчной буквы d , в то время как в других местах у вас это прописная D No Data . В python это не то же самое. Если мы исправим это:

 df.loc[(df['A'] != "Closed") amp; (df['B'] != "Closed") amp;
       (df['A'] != "No Data") amp; (df['B'] != "No Data")]
  

что дает нам то же самое, что и при первой попытке:

            A         B  ~df.A.isin  ~df.B.isin  ~A amp; ~B  ~A | ~B
8   Approved  Approved  True  True  True  True  True  True  True
11  Restrict  Approved  True  True  True  True  True  True  True
  

Если вы немного измените это выражение, используйте круглые скобки и | ( or ):

 df.loc[((df['A'] != "Closed") amp; (df['A'] != "No Data")) | 
       ((df['B'] != "Closed") amp; (df['B'] != "No Data"))]
  

мы получаем:

            A         B  ~df.A.isin  ~df.B.isin  ~A amp; ~B  ~A | ~B
2   Approved    Closed        True       False    False     True
4     Closed  Approved       False        True    False     True
5    No Data  Restrict       False        True    False     True
6   Approved   No Data        True       False    False     True
7     Closed  Restrict       False        True    False     True
8   Approved  Approved        True        True     True     True
9    No Data  Approved       False        True    False     True
10  Restrict   No Data        True       False    False     True
11  Restrict  Approved        True        True     True     True