Pandas фильтрация с несколькими условиями - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь отфильтровать данные по нескольким условиям, используя .isin

Я создал фрейм данных с такими данными.

    col_a   col_b   col_c
    abc     yes     a
    abc     no      b
    abc     yes     a
    def     no      b
    def     yes     a
    def     no      b
    def     yes     a
    def     no      b
    ghi     yes     a
    ghi     no      b
    ghi     yes     a

Когда я Попробуйте этот тип фильтрации, ссылаясь на это решение, которое я видел при переполнении стека. Я получаю все значения NaN. Pandas: фильтрация нескольких условий

Как применить три условия для фильтрации?

fil_1 = test.isin({'col_a': ['abc','def','ghi']})
fil_2 = test.isin({'col_b': ['yes']})
fil_3 = test.isin({'col_c' :['a']})
data = test[fil_1 & fil_2 & fil_3]
data

Ответы [ 3 ]

1 голос
/ 06 февраля 2020

Вам нужно:

fil_1 = test['col_a'].isin(['abc','def','ghi'])
fil_2 = test['col_b'].isin(['yes'])
fil_3 = test['col_c'].isin(['a'])

или

test.isin({'col_a': ['abc','def','ghi'],
           'col_b': ['yes'],
           'col_c' :['a']}).all(axis = 1)

df_filtered = test[fil_1 & fil_2 & fil_3]
print(df_filtered)
   col_a col_b col_c
0    abc   yes     a
2    abc   yes     a
4    def   yes     a
6    def   yes     a
8    ghi   yes     a
10   ghi   yes     a

или лог c |

fil = test.isin({'col_a': ['abc','def','ghi'],'col_b': ['yes'],'col_c' :['a']})
df_filtered = df[fil]
print(df_filtered)

   col_a col_b col_c
0    abc   yes     a
1    abc   NaN   NaN
2    abc   yes     a
3    def   NaN   NaN
4    def   yes     a
5    def   NaN   NaN
6    def   yes     a
7    def   NaN   NaN
8    ghi   yes     a
9    ghi   NaN   NaN
10   ghi   yes     a

Теперь, если мы также используем DataFrame.all:

df_filtered = df[fil.all(axis = 1)]
print(df_filtered)
   col_a col_b col_c
0    abc   yes     a
2    abc   yes     a
4    def   yes     a
6    def   yes     a
8    ghi   yes     a
10   ghi   yes     a

Деталь

print(fil)
    col_a  col_b  col_c
0    True   True   True
1    True  False  False
2    True   True   True
3    True  False  False
4    True   True   True
5    True  False  False
6    True   True   True
7    True  False  False
8    True   True   True
9    True  False  False
10   True   True   True

print(test.isin({'col_a': ['abc','def','ghi']}))
    col_a  col_b  col_c
0    True  False  False
1    True  False  False
2    True  False  False
3    True  False  False
4    True  False  False
5    True  False  False
6    True  False  False
7    True  False  False
8    True  False  False
9    True  False  False
10   True  False  False

это возвращение False в столбцах с отличиями от col_a, поэтому вы получили NaN значения, потому что вы использовали &

0 голосов
/ 06 февраля 2020

Возможное решение для фильтрации вашего фрейма данных заключается в следующем: «cond1» выберите все значения в col_a, которые являются либо «ab c», либо «def», либо «ghi». Тогда col_b - это только «да», а col_ c - только «а».

cond1=(apd.col_a=="abc") | (apd.col_a=="def") | (apd.col_a=="ghi")

apd[ cond1 & (apd.col_b=="yes") & (apd.col_c=="a")]

Результат:

    col_a   col_b   col_c
0   abc     yes     a
2   abc     yes     a
4   def     yes     a
6   def     yes     a
8   ghi     yes     a
10  ghi     yes     a
0 голосов
/ 06 февраля 2020

Вот решение с одной линией,

test[test.col_a.isin(['abc','def','ghi']) & test.col_b.isin(['yes']) & test.col_c.isin(['a'])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...