Как отфильтровать dataframe в python
Подсчет и фильтрация строк в DataFrame Pandas
Чтобы подсчитать количество строк в DataFrame, вы можете использовать свойство shape или метод count().
DataFrame.shape возвращает кортеж, содержащий количество строк в качестве первого элемента и количество столбцов в качестве второго элемента. Индексируя первый элемент, мы можем получить количество строк в DataFrame.
DataFrame.count() со значениями параметров по умолчанию возвращает количество значений по каждому столбцу. Каждый столбец содержит одинаковое количество значений, равное количеству строк. Индексируя первый элемент, мы можем получить количество строк в DataFrame.
Пример 1: подсчет с помощью shape
В этом примере мы будем использовать свойство DataFrame.shape, чтобы получить количество строк.
Пример 2: с помощью count()
В этом примере мы будем использовать метод count() для подсчета количества строк в DataFrame.
В этом руководстве на примерах Python мы узнали, как подсчитать количество строк в заданном DataFrame разными способами с помощью примеров программ.
Фильтрации строк
Чтобы отфильтровать строки в DataFrame, вы можете использовать функцию isin(). Она возвращает логический DataFrame, который при использовании с исходным фильтрует строки, которые подчиняются критериям фильтра.
Вы также можете использовать query() для фильтрации строк, удовлетворяющих заданному логическому выражению.
Пример 1: с помощью isin()
В этом примере мы возьмем DataFrame с двумя столбцами с именами a, b и четырьмя строками. Мы будем фильтровать при условии, что значения столбца a лежат в заданном диапазоне.
Функция isin() возвращает True для строк, значения столбца в которых находятся в диапазоне (3,6). В противном случае функция возвращает false.
df [out] возвращает только те строки, значение которых равно True, что приводит к отфильтрованному выводу.
Пример 2: с помощью query()
В этом примере мы инициализируем DataFrame двумя столбцами a и b, содержащими четыре строки. Мы будем фильтровать те строки, у которых значение столбца b больше 4.
Мы будем использовать query() для фильтрации строк.
В этом руководстве на примерах Python мы узнали, как фильтровать DataFrame на основе условий, применяемых к значениям его столбцов.
All the Ways to Filter Pandas Dataframes
Pandas is by far one of the essential tools required for data work within Python. It offers many different ways to filter Pandas dataframes – this tutorial shows you all the different ways in which you can do this!
Specifically, you’ll learn how to easily use index and chain methods to filter data, use the filter function, the query function, and the loc function to filter data.
Filter Pandas Dataframes Video Tutorial
Loading the Sample Dataframe
Let’s begin by loading a sample dataframe that we’ll use throughout the tutorial.
We used the parse_dates parameter to ensure that the Dates column was read as datetime.
Filter Pandas Dataframe by Column Value
Pandas makes it incredibly easy to select data by a column value. This can be accomplished using the index chain method.
Select Dataframe Values Greater Than Or Less Than
For example, if you wanted to select rows where sales were over 300, you could write:
We can see from the shape method that 352 rows have been filtered out of the dataset.
Filtering a Dataframe based on Multiple Conditions
If you want to filter based on more than one condition, you can use the ampersand (&) operator or the pipe (|) operator, for and and or respectively.
Let’s try an example. First, you’ll select rows where sales are greater than 300 and units are greater than 20. Then you’ll do the same with an or operator:
Filter a Dataframe Based on Dates
Pandas also makes it very easy to filter on dates. You can filter on specific dates, or on any of the date selectors that Pandas makes available.
If you want to filter on a specific date (or before/after a specific date), simply include that in your filter query like above:
The first piece of code shows any rows where Date is later than May 1, 2020. You can also use multiple filters to filter between two dates:
This filters down to only show May 2020 data.
Using Pandas Date Selectors to Filter Data
Pandas date selectors allow you to access attributes of a particular date. Let’s see how these work in action:
Here we’ve assigned new columns, based on accessing just a single part of the Date column:
You can use these date selectors to filter your data.
If you only wanted to show data for Tuesdays, you could use the weekday selector:
This type of selecting data is incredibly helpful if you want to filter down to a specific year or month, and don’t want to type and conditions.
It makes your code much easier to write (and to read).
Filter a Dataframe to a Specific String
If you want to filter rows to only show rows where there is a specific exists, you can do this also with the index method. Say you wanted to select only rows from East region:
Filter To Show Rows Starting with a Specific Letter
Similarly, you can select only dataframe rows that start with a specific letter. For example, if you only wanted to select rows where the region starts with ‘E’, you could write:
Select Dataframe Rows based on List of Values
If you want to select rows matching a set of values, you could write long “or” statements, or you could use the isin method.
For example, if you wanted to select records from East and West Regions, you could write:
Or, you could use the isin method, to make this much easier:
This returns the same thing but is much easier to write!
Select Dataframe Rows Using Regular Expressions (Regex)
For example, if you wanted to filter to show only records that end in “th” in the Region field, you could write:
To learn more about regex, check out this link.
Select Null or Not Null Dataframe Rows
Pandas makes it easy to select select either null or non-null rows.
To select records containing null values, you can use the both the isnull and any functions:
If you only want to select records where a certain column has null values, you could write:
To select only records with non-null records
To select only records that are not null, you can use the notnull function:
How to use the Pandas Query Function
The query function takes an expression that evaluates to a boolean statement and uses that to filter a dataframe.
For example, you can use a simple expression to filter down the dataframe to only show records with Sales greater than 300:
To query based on multiple conditions, you can use the and or the or operator:
How to use the Loc and iloc Functions in Pandas
The loc and iloc functions can be used to filter data based on selecting a column or columns and applying conditions.
Tip! To get a deep dive into the loc and iloc functions, check out my complete tutorial on these functions by clicking here.
For example, to select data from East region, you could write:
Conclusion
In this post, we covered off many ways of selecting data using Pandas. We used examples to filter a dataframe by column value, based on dates, using a specific string, using regex, or based on items in a list of values. We also covered how to select null and not null values, used the query function, as well as the loc function.
To learn more about date selectors, check out the official documentation here.
Check out my ebook to get started with Python for Data Science!
Как отфильтровать датафрейм Pandas за 3 минуты
В Pandas есть много способов отфильтровать DataFrame. Я познакомлю вас с наиболее важными вариантами с помощью Симпсонов.
Логическое индексирование
Пример 1. Выбор строк с определенным значением.
Давайте найдем все записи для Барта, чтобы мы могли переслать их его менеджеру:
На съемочной площадке дошли слухи, что мы являемся экспертами в области данных, а партнеры по рекламе хотят знать, что именно показывают дети в рекламных целях:
Мы увидим саксофон, автомобили и рогатки в телевизионной рекламе.
Также Симпсоны должны экономить деньги. Новые правила:
2) можно заказывать не более 3 предметов на человека
Я надеюсь, что Гомер и Барт останутся с нами и не покинут шоу в ярости…
К сожалению, звезды сериала не в восторге от этих сокращений, поэтому первые спонсоры выступают, чтобы помочь:
Позиционная индексация
Иногда вы не хотите фильтровать в соответствии с определенным условием, но выбираете определенные строки DataFrame в зависимости от их положения. В этом случае мы используем нарезку, чтобы получить нужные строки.
Новый стажер в вашем отделе не должен работать напрямую со всем набором данных, ему нужны только первые три записи:
У вас много работы, и вы получите другого стажера. Чтобы оба слушателя работали над своими задачами независимо, теперь вы сохраняете последние три строки записи:
Вывод
Мы можем выбрать любую конкретную строку из нашего набора данных в соответствии с ее значениями или положением. Pandas предлагает простые способы учета нескольких значений при формулировании условия. Списки и условия могут быть легко связаны друг с другом.
iPython R Rapid Miner
В iPython мои (черновики) упражнения с Python, в разделе «Mining» собраны материалы по R, Rapid Miner, Weka, Gate. в «Projects» фрагменты старых и заготовки для новых исследований. записано для себя, открыто для всех.
Поиск по блогу
Страницы
суббота, 18 апреля 2015 г.
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | Granta | Lada | 45570 | 52765 | (7,195) | -14% | 13077 | 15596 | (2,519) | -16% | 30-4-2014 |
| 1 | 2 | Solaris | Hyundai | 35218 | 35941 | (723) | -2% | 9774 | 10553 | (779) | -7% | 30-4-2014 |
| 2 | 3 | New Rio | KIA | 29971 | 28211 | 1,760 | 6% | 9045 | 8430 | 615 | 7% | 30-4-2014 |
How to filter the DataFrame rows of pandas by “within”/“in”?¶
Как отобрать строки по численным значениям в столбце? Очень просто.
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | Granta | Lada | 45570 | 52765 | (7,195) | -14% | 13077 | 15596 | (2,519) | -16% | 30-4-2014 |
| 1 | 2 | Solaris | Hyundai | 35218 | 35941 | (723) | -2% | 9774 | 10553 | (779) | -7% | 30-4-2014 |
| 2 | 3 | New Rio | KIA | 29971 | 28211 | 1,760 | 6% | 9045 | 8430 | 615 | 7% | 30-4-2014 |
| 3 | 4 | Duster | Renault | 28153 | 25945 | 2,208 | 9% | 7606 | 7600 | 6 | 0% | 30-4-2014 |
| 4 | 5 | Kalina | Lada | 25864 | 28395 | (2,531) | -9% | 7731 | 8857 | (1,126) | -13% | 30-4-2014 |
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 3 | New Rio | KIA | 29971 | 28211 | 1,760 | 6% | 9045 | 8430 | 615 | 7% | 30-4-2014 |
| 3 | 4 | Duster | Renault | 28153 | 25945 | 2,208 | 9% | 7606 | 7600 | 6 | 0% | 30-4-2014 |
| 4 | 5 | Kalina | Lada | 25864 | 28395 | (2,531) | -9% | 7731 | 8857 | (1,126) | -13% | 30-4-2014 |
Есть список значений. Выберем из фрейма по этому списку (строк или чисел)¶
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | Solaris | Hyundai | 35218 | 35941 | (723) | -2% | 9774 | 10553 | (779) | -7% | 30-4-2014 |
| 3 | 4 | Duster | Renault | 28153 | 25945 | 2,208 | 9% | 7606 | 7600 | 6 | 0% | 30-4-2014 |
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 3 | New Rio | KIA | 29971 | 28211 | 1,760 | 6% | 9045 | 8430 | 615 | 7% | 30-4-2014 |
| 3 | 4 | Duster | Renault | 28153 | 25945 | 2,208 | 9% | 7606 | 7600 | 6 | 0% | 30-4-2014 |
Теперь объединим оба условия, во втором случае ипользуем волшебный знак
ВНИМАНИЕ. Зто отрицание, которое меняет условие на противоположное.
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 3 | 4 | Duster | Renault | 28153 | 25945 | 2,208 | 9% | 7606 | 7600 | 6 | 0% | 30-4-2014 |
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 3 | New Rio | KIA | 29971 | 28211 | 1,760 | 6% | 9045 | 8430 | 615 | 7% | 30-4-2014 |
isin() is ideal if you have a list of exact matches, but if you have a list of partial matches or substrings to look for, you can filter using the str.contains method and regular expressions.
Сначала попробуем простейший вариант с поиком по маске. Он отлично работает. В настройках можно поменять умолчания (нас волнцет в первую очередь чуствительность к регистру), вот строка из документации:
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 3 | New Rio | KIA | 29971 | 28211 | 1,760 | 6% | 9045 | 8430 | 615 | 7% | 30-4-2014 |
| 20 | 21 | Sportage | KIA | 9979 | 10358 | (379) | -4% | 2526 | 2857 | (331) | -12% | 30-4-2014 |
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 3 | New Rio | KIA | 29971 | 28211 | 1,760 | 6% | 9045 | 8430 | 615 | 7% | 30-4-2014 |
| 20 | 21 | Sportage | KIA | 9979 | 10358 | (379) | -4% | 2526 | 2857 | (331) | -12% | 30-4-2014 |
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 12 | 13 | Octavia A7 | Škoda | 13171 | 0 | NaN | NaN | 3753 | 0 | NaN | NaN | 30-4-2014 |
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | Granta | Lada | 45570 | 52765 | (7,195) | -14% | 13077 | 15596 | (2,519) | -16% | 30-4-2014 |
| 1 | 2 | Solaris | Hyundai | 35218 | 35941 | (723) | -2% | 9774 | 10553 | (779) | -7% | 30-4-2014 |
Запомним, что важно соблюдвать (как минимум) два неочевидных условия: обрабатывается только текстовый столбец, и без пропусков данных NaN
.str.contains и регулярные выражения¶
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | Granta | Lada | 45570 | 52765 | (7,195) | -14% | 13077 | 15596 | (2,519) | -16% | 30-4-2014 |
| 1 | 2 | Solaris | Hyundai | 35218 | 35941 | (723) | -2% | 9774 | 10553 | (779) | -7% | 30-4-2014 |
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem |
|---|
Вот вариант отобрать строки, в которых нет пропусков данных NaN
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | Granta | Lada | 45570 | 52765 | (7,195) | -14% | 13077 | 15596 | (2,519) | -16% | 30-4-2014 |
| 1 | 2 | Solaris | Hyundai | 35218 | 35941 | (723) | -2% | 9774 | 10553 | (779) | -7% | 30-4-2014 |
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | Granta | Lada | 45570 | 52765 | (7,195) | -14% | 13077 | 15596 | (2,519) | -16% | 30-4-2014 |
| 1 | 2 | Solaris | Hyundai | 35218 | 35941 | (723) | -2% | 9774 | 10553 | (779) | -7% | 30-4-2014 |
А теперь попробуем неработавшиий ранее (из-за пропусков) пример и снова получим ту же ошибку:
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem |
|---|
Не могу отфильтровать пропуски ни одним из методов, оказывается для них есть специальные методы
How to drop rows of Pandas dataframe whose value of certain column is NaN¶
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 10 | 11 | Logan | Renault | 14342 | 16674 | (2,332) | -14% | 3796 | 4890 | (1,094) | -22% | 30-4-2014 |
| 11 | 12 | Sandero | Renault | 13777 | 14464 | (687) | -5% | 3796 | 4084 | (288) | -7% | 30-4-2014 |
| 13 | 14 | 4×4 | Lada | 12931 | 14599 | (1,668) | -11% | 3784 | 3808 | (24) | -1% | 30-4-2014 |
| 14 | 15 | RAV 4 | Toyota | 12501 | 11410 | 1,091 | 10% | 4391 | 4974 | (583) | -12% | 30-4-2014 |
| 15 | 16 | Cruze | Chevrolet | 12363 | 14565 | (2,202) | -15% | 3014 | 4284 | (1,270) | -30% | 30-4-2014 |
А вот более точный вариант для конкретного подмножества столбцов, здесь мы берем столбцы без пропусков, и 12 строка появляется.
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 10 | 11 | Logan | Renault | 14342 | 16674 | (2,332) | -14% | 3796 | 4890 | (1,094) | -22% | 30-4-2014 |
| 11 | 12 | Sandero | Renault | 13777 | 14464 | (687) | -5% | 3796 | 4084 | (288) | -7% | 30-4-2014 |
| 12 | 13 | Octavia A7 | Škoda | 13171 | 0 | NaN | NaN | 3753 | 0 | NaN | NaN | 30-4-2014 |
| 13 | 14 | 4×4 | Lada | 12931 | 14599 | (1,668) | -11% | 3784 | 3808 | (24) | -1% | 30-4-2014 |
| 14 | 15 | RAV 4 | Toyota | 12501 | 11410 | 1,091 | 10% | 4391 | 4974 | (583) | -12% | 30-4-2014 |
Еще раз обращаю внимание на этот пост, здесь все варианты ответов How to drop rows of Pandas dataframe whose value of certain column is NaN¶
И вот этот вариант тоже рабочий
А вот этот наворот с numpy у меня не работает.
Теперь мы можем решить задачку, когда в столбце есть Nan¶
Сначала мы убираем строки, в которых есть Nan в столбце ‘u1413m3’, создаем новый объект DataFrame, а с ним уже работает метод str.contains()
| n1_y | Model | Brandt | 2014y3 | 2013y3 | u1413y3 | 1413y3 | 2014m3 | 2013m3 | u1413m3 | 1413m3 | Datem | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 17 | 18 | Focus | Ford | 10923 | 22278 | (11,355) | -51% | 2549 | 5546 | (2,997) | -54% | 30-4-2014 |
Казалось бы, решение найдено. но чтоя буду делать с этип общипанным новым объектом? Можно ли не создавать дополнитеьный объект?
Оказывается, что нельзя. Начинается переиндексация, а потом, когда выясняется, что старый индекс поломан после того, как убрали строку с Nan, то встает вопрос, какой индекс использовать:


