Цепочки серии Pandas: фильтр по логическому значению - PullRequest
2 голосов
/ 11 июня 2019

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

В настоящее время у меня есть:

s.apply(lambda x: myfunc(x, myparam).where(lambda x: x).dropna()

Мне нужно только сохранять записи, где myfunc возвращает true. myfunc это сложная функция, использующая сторонний код и работающая только с отдельными элементами.

Как я могу сделать это более понятным?

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Использовать boolean indexing:

mask = s.apply(lambda x: myfunc(x, myparam))
print (s[mask])

Если также изменяются значения индекса в mask фильтровать по массиву 1d:

#pandas 0.24+
print (s[mask.to_numpy()])

#pandas below
print (s[mask.values])

РЕДАКТИРОВАТЬ:

s = pd.Series([1,2,3])

def myfunc(x, n):
    return x > n

myparam = 1
a = s[s.apply(lambda x: myfunc(x, myparam))]
print (a)
1    2
2    3
dtype: int64

Возможно решение с вызываемым , но, на мой взгляд, немного сложнее:

a = s.loc[lambda s: s.apply(lambda x: myfunc(x, myparam))]
print (a)
1    2
2    3
dtype: int64
0 голосов
/ 11 июня 2019

Вы можете понять это с приведенным ниже примером кода

import pandas as pd

data = pd.Series([1,12,15,3,5,3,6,9,10,5])
print(data)

# filter data based on a condition keep only rows which are multiple of 3
filter_cond = data.apply(lambda x:x%3==0)
print(filter_cond)
filter_data = data[filter_cond]
print(filter_data)

Этот код собирается отфильтровать данные ряда, кратные 3. Чтобы сделать это, мы просто помещаем условие фильтрации и применяем его к данным ряда. Вы можете проверить это с помощью сгенерированного ниже вывода.

Данные серии образцов:

0     1
1    12
2    15
3     3
4     5
5     3
6     6
7     9
8    10
9     5
dtype: int64

Выход условного фильтра:

0    False
1     True
2     True
3     True
4    False
5     True
6     True
7     True
8    False
9    False
dtype: bool

Окончательные требуемые данные фильтра:

1    12
2    15
3     3
5     3
6     6
7     9
dtype: int64

Надеюсь, это поможет вам понять, как мы можем применять условные фильтры к данным серии.

...