Отфильтруйте кадр данных pandas по нескольким столбцам для частичного совпадения строк, используя значения из dict - PullRequest
0 голосов
/ 28 октября 2018

Мне нужно отфильтровать кадр данных по нескольким значениям из dict

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv')
filters_raw = {'continent': {'filterTerm': 'Asi', 'column': {'rowType': 'filter', 'key': 'continent', 'name': 'continent', 'editable': True, 'sortable': True, 'resizable': True, 'filterable': True, 'width': 147, 'left': 60}}, 'gdpPercap': {'filterTerm': '9', 'column': {'rowType': 'filter', 'key': 'gdpPercap', 'name': 'gdpPercap', 'editable': True, 'sortable': True, 'resizable': True, 'filterable': True, 'width': 147, 'left': 354}}, 'lifeExp': {'filterTerm': '4', 'column': {'rowType': 'filter', 'key': 'lifeExp', 'name': 'lifeExp', 'editable': True, 'sortable': True, 'resizable': True, 'filterable': True, 'width': 147, 'left': 501}}, 'pop': {'filterTerm': '3', 'column': {'rowType': 'filter', 'key': 'pop', 'name': 'pop', 'editable': True, 'sortable': True, 'resizable': True, 'filterable': True, 'width': 147, 'left': 648}}, 'year': {'filterTerm': '2007', 'column': {'rowType': 'filter', 'key': 'year', 'name': 'year', 'editable': True, 'sortable': True, 'resizable': True, 'filterable': True, 'width': 147, 'left': 795}}, 'country': {'filterTerm': 'af', 'column': {'rowType': 'filter', 'key': 'country', 'name': 'country', 'editable': True, 'sortable': True, 'resizable': True, 'filterable': True, 'width': 147, 'left': 207}}}
filters = {i:filters_raw[i]['filterTerm'] for i in filters_raw.keys()}

Чтобы использовать dict для получения точных совпадений, я могу сделать это на основе этого ответа ( Фильтрация кадра данных pandas по значениямиз диктанта );;

dff = df.loc[(df[list(filters)] == pd.Series(filters)).all(axis=1)]

Но если я хочу фильтровать таким же образом, но не ограничиваться только точными совпадениями, но также получать совпадения, где значение из dict содержится в качестве подстроки в кадре данных.Как бы я это сделал?

Требуемый вывод - это информационный фрейм, в котором только значения соответствуют всем условиям одновременно.С фильтрами выше;

Dff
Asia Afghanistan 974.5803384 43.828 31889923 2007

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Одним из решений может быть использование pd.Series.str.starstwith для поиска строк, совпадающих со строками в filters.

Вы можете создать маску для этих строк следующим образом:

mask =  df.astype(str).apply(lambda x: x.str.lower()
        ).apply(lambda x: x.str.startswith(filters[x.name].lower()),
                axis=0).all(axis=1)

По сути, вы конвертируете исходный кадр данных в строку и нижний регистр, а затем переходите от столбца к столбцу, проверяя элементы, начинающиеся сстрока в фильтре для этого столбца (т.е. filters['continent']).Наконец, вы устанавливаете в истинные строки, где все ячейки содержат элементы в filter

Результат будет:

df[mask]

        country  year         pop continent  lifeExp   gdpPercap
11  Afghanistan  2007  31889923.0      Asia   43.828  974.580338

Надеюсь, что это послужит.

0 голосов
/ 28 октября 2018

Взгляните на pandas.Series.str.contains , где вы можете использовать регулярное выражение.Также есть обработка строк функций, которые могут быть более приспособлены для того, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...