#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