pandas
Индексирование и выбор данных
Метод iloc (short for integer location ) позволяет выбирать строки фрейма данных на основе их индекса местоположения. Таким образом можно срезать тактовые кадры так же, как с помощью списка разрезов на языке Python.
Расположение строк может быть объединено с расположением столбца
Нарезка этикетками
При использовании меток в результаты включены как начало, так и стоп.
Строки от R0 до R2 :
Обратите внимание, что loc отличается от iloc потому что iloc исключает конечный индекс
Столбцы от C до E :
Выбор смешанной позиции и метки
Выберите строки по положению и столбцы по метке:
Если индекс является целым числом, .ix будет использовать метки, а не позиции:
Булевское индексирование
Можно выбрать строки и столбцы блока данных с помощью булевых массивов.
Фильтрация столбцов (выбор «интересный», удаление ненужных, использование RegEx и т. Д.)
сгенерировать образец DF
показать столбцы, содержащие букву 'a'
показать столбцы с использованием фильтра RegEx (b|c|d) — b или c или d :
показать все столбцы , кроме тех , начиная с (другими словами удалять / удалить все столбцы , удовлетворяющие заданной RegEx) a
Фильтрация / выбор строк с использованием метода `.query ()`
генерировать случайные DF
выберите строки, где значения в столбце A > 2 и значения в столбце B < 5
с использованием .query() с переменными для фильтрации
Наклонная нарезка
Может возникнуть необходимость пересекать элементы серии или строки кадра данных таким образом, что следующий элемент или следующая строка зависит от ранее выбранного элемента или строки. Это называется зависимостью пути.
Рассмотрим следующие временные ряды s с нерегулярной частотой.
Предположим, что условие зависит от пути. Начиная с первого члена серии, я хочу захватить каждый последующий элемент таким образом, чтобы абсолютная разница между этим элементом и текущим элементом была больше или равна x .
Мы решим эту проблему, используя генераторы python.
Функция генератора
Тогда мы можем определить, что новая серия moves так
Построение их обоих
Аналогом для data-кадров будет:
Получить первые / последние n строк кадра данных
Чтобы просмотреть первые или последние несколько записей фрейма данных, вы можете использовать методы head и tail
Чтобы вернуть первые n строк, используйте DataFrame.head([n])
Чтобы вернуть последние n строк, используйте DataFrame.tail([n])
Без аргумента n эти функции возвращают 5 строк.
Обратите внимание, что обозначение среза для head / tail будет:
Выбор отдельных строк в кадре данных
Чтобы получить отдельные значения в col_1 вы можете использовать Series.unique()
Но Series.unique () работает только для одного столбца.
Для имитации выбора уникального col_1, col_2 SQL вы можете использовать DataFrame.drop_duplicates() :
Это даст вам все уникальные строки в области данных. Так что если
Чтобы указать столбцы, которые следует учитывать при выборе уникальных записей, передайте их в качестве аргументов
Отфильтруйте строки с отсутствующими данными (NaN, None, NaT)
Если у вас есть dataframe с отсутствующими данными ( NaN , pd.NaT , None ), вы можете отфильтровать неполные строки
DataFrame.dropna все строки, содержащие хотя бы одно поле с отсутствующими данными
Чтобы просто удалить строки, в которых отсутствуют данные в указанных столбцах, используйте subset
Используйте параметр inplace = True для замены на месте фильтрованным фреймом.
7 полезных операций в Pandas при работе с DataFrame
Абстракция датафрейма является одной из наиболее полезных концепций в современной экосистеме управления данными. Вращается она главным образом вокруг табличных структур, которые имеют повышенную производительность при обновлении и запросе данных различными способами. Сериализация/десериализация этих структур из/в различные форматы файлов упрощает работу с данными. Более того, возможность производить различные SQL-подобные операции, такие как объединение, наряду с выполнением математических вычислений в самом датафрейме существенно расширяет возможности программиста.
Эта статья подчеркивает некоторые наиболее полезные операции, которые можно выполнять с помощью абстракции датафрейма. Реализовывать мы их будем через библиотеку Pandas. Постараюсь представить материал в интуитивно понятной форме, чтобы в дальнейшем вы могли применить эти знания в других случаях или при работе с другими фреймворками.
1. Конкатенация DataFrame
Есть два способа конкатенировать датафрейм A и B . Представьте их как проиндексированные таблицы. Эти две таблицы можно объединить либо по оси y, либо по оси x.
Если требуется конкатенировать их вдоль x, то вызов API будет таким:
Если же вдоль y, то таким:
Применение
Предположим, у вас есть большое количество CSV-файлов или XLSX-данных, которые нужно присоединить друг к другу. Одним из способов сделать это будет считать данные файлов в датафреймы и использовать инструкцию pd.concat([file_1, file_2]) . Программно можно перебрать имена файлов (используя модуль glob для чтения набора имен файлов с помощью техники сопоставления шаблонов, например regex), считать их в датафрейм, соединить в памяти и сериализовать конкатенированные датафреймы в нужный формат файлов.
Вариант с axis = 0 используется нечасто, но его можно применять в сценариях, когда нужно обработать массивы данных, собранных с упорядочиванием. То есть, когда последовательность данных соответствует последовательности других массивов данных. В таком случае эти массивы можно объединить вдоль оси x, получив более объемное и значительное представление в табличном формате. Затем к полученной структуре можно применять операции, использующие все типы данных в ее столбцах.
2. Разделение DataFrame
Датафрейм можно разделить множеством способов, и выбор техники полностью зависит от цели этого разделения. Рассмотрим ряд случаев.
Просмотр сведений
В некоторых сценариях, особенно при написании кода с помощью блокнотов (например Jupyter), мы заглядываем в датафрейм, только чтобы понять, как он выглядит. В таких случаях можно использовать метод head() .
Исключение столбцов
Этот метод разделяет датафрейм вдоль оси y, то есть просто выбрасывает из него часть столбцов. Используется данный метод в типичном сценарии, когда нам не нужно, чтобы конечный DataFrame содержал эти столбцы, или когда мы предполагаем, что при дальнейшем обновлении структура станет занимать слишком много памяти.
Удаление датафреймов друг из друга
Представим, что у нас есть датафрейм X , состоящий из столбцов [A, B, C, D] , и датафрейм Y , состоящий из подмножества столбцов X . Нам нужно удалить Y из X . Это можно сделать так:
Конкатенация этих датафреймов приведет к дублированию общих записей, которые в итоге будут удалены выражением keep = false функции drop_duplicates() .
Применение
Предположим, что столбец A — это определенный вид ID сведений о работнике. К примеру, датафрейм X состоит из всех данных о работниках, а датафрейм Y содержит данные (с той же структурой) о работниках, не разбирающихся в Python. Нам нужно отфильтровать сведения о сотрудниках, которые не знакомы с Python.
Определение дельты записей на основе столбца
Представим, что у нас есть датафрейм X , состоящий из столбцов [A, B, C, D] , а также датафрейм Y , состоящий из тех же столбцов. При этом некоторые элементы столбцов A этих датафреймов являются общими. Нам нужно получить из датафрейма X строки, которые не содержат значения из столбца A , находящиеся в столбце A датафрейма Y .
Применение
Взгляните на эту таблицу:
Эти пары могли быть сгенерированы, например, из двух журналов: старого и нового. Нам нужно найти пары ID, принадлежащие одному и тому же человеку. Предположим, что ваш отдел кадров неожиданно заявляет, что определенный список ( hr_list ) сотрудников с ID_1 больше в компании не работает. Как удалить их из этого датафрейма?
Разделение на основе значений столбцов
Датафрейм можно фильтровать на основе значений столбца. В этом случае критерий отбора может включать несколько выражений при условии, что они будут возвращать логические значения.
Это простейший пример.
3. Подсчет записей в столбце
Это эффективный способ определения количества различных элементов в столбце.
Ответ на приведенный выше запрос можно получить следующим подходом:
4. Чтение фрагментов DataFrame
В некоторых случаях будет более эффективно считывать только части датафрейма, особенно при его больших размерах. Обратите внимание, что каждый датафрейм является индексированной табличной структурой, находящейся в памяти, а значит потребляющей пространство, потенциально нужное другим структурам данных. В связи с этим при работе с большими массивами информации всегда лучше считывать только ее нужную часть.
Более того, можно считывать большие файлы в отдельные фрагменты и маршалировать их в датафреймы.
Таким образом одновременно в памяти удерживается только фрагмент размером chunksize .
5. Применение функций к строкам
Бывают случаи, в которых требуется внести изменения в конкретные столбцы детафрейма. К примеру, в датафрейме X , содержащем столбцы A , B и C , мы можем применить функцию f() к значениям столбца B , чтобы сохранить их в столбце D .
Эта операция окажется намного быстрее, чем перебор всего датафрейма с помощью iterrows() .
Есть и альтернативный метод. Его можно использовать, когда функцию f() требуется применить только к одному столбцу.
6. Объединение двух датафреймов
По аналогии с реляционными базами данных датафреймы можно объединять merge , используя разрешающий столбец.
Однако стоит заметить, что операция merge является дорогостоящей, в связи с чем перед слиянием больших датасетов стоит проявлять особое внимание. В случаях, когда датасеты слишком велики, рекомендуется использовать методы группировки (англ.), чтобы избежать перегрузки памяти и связанных с этим проблем производительности.
7. Переименование столбцов
Переименовывать столбцы особенно полезно перед сериализацией файла или перед внедрением стороннего хранилища данных.
Получение первых N строк в DataFrame Pandas
Чтобы получить первые N строк DataFrame Pandas, используйте функцию head(). Вы можете передать необязательное целое число, представляющее первые N строк. Если вы не передадите никакого числа, он вернет первые 5 строк, это означает, что по умолчанию N равно 5.
Пример 1
В этом примере мы получим первые 3 строки.
Пример 2
В этом примере мы не будем передавать какое-либо число в функцию head(), которая по умолчанию возвращает первые 5 строк.
В этом руководстве по Pandas мы извлекли первые N строк, используя метод head() с помощью примеров программ Python.
How do I select a subset of a DataFrame ?#
How do I select specific columns from a DataFrame ?#
I’m interested in the age of the Titanic passengers.
To select a single column, use square brackets [] with the column name of the column of interest.
Each column in a DataFrame is a Series . As a single column is selected, the returned object is a pandas Series . We can verify this by checking the type of the output:
And have a look at the shape of the output:
DataFrame.shape is an attribute (remember tutorial on reading and writing , do not use parentheses for attributes) of a pandas Series and DataFrame containing the number of rows and columns: (nrows, ncolumns). A pandas Series is 1-dimensional and only the number of rows is returned.
I’m interested in the age and sex of the Titanic passengers.
To select multiple columns, use a list of column names within the selection brackets [] .
The inner square brackets define a Python list with column names, whereas the outer brackets are used to select the data from a pandas DataFrame as seen in the previous example.
The returned data type is a pandas DataFrame:
The selection returned a DataFrame with 891 rows and 2 columns. Remember, a DataFrame is 2-dimensional with both a row and column dimension.
For basic information on indexing, see the user guide section on indexing and selecting data .
How do I filter specific rows from a DataFrame ?#
I’m interested in the passengers older than 35 years.
To select rows based on a conditional expression, use a condition inside the selection brackets [] .
The condition inside the selection brackets titanic["Age"] > 35 checks for which rows the Age column has a value larger than 35:
The output of the conditional expression ( > , but also == , != , < , <= ,… would work) is actually a pandas Series of boolean values (either True or False ) with the same number of rows as the original DataFrame . Such a Series of boolean values can be used to filter the DataFrame by putting it in between the selection brackets [] . Only rows for which the value is True will be selected.
We know from before that the original Titanic DataFrame consists of 891 rows. Let’s have a look at the number of rows which satisfy the condition by checking the shape attribute of the resulting DataFrame above_35 :
I’m interested in the Titanic passengers from cabin class 2 and 3.
Similar to the conditional expression, the isin() conditional function returns a True for each row the values are in the provided list. To filter the rows based on such a function, use the conditional function inside the selection brackets [] . In this case, the condition inside the selection brackets titanic["Pclass"].isin([2, 3]) checks for which rows the Pclass column is either 2 or 3.
The above is equivalent to filtering by rows for which the class is either 2 or 3 and combining the two statements with an | (or) operator:
When combining multiple conditional statements, each condition must be surrounded by parentheses () . Moreover, you can not use or / and but need to use the or operator | and the and operator & .
See the dedicated section in the user guide about boolean indexing or about the isin function .
I want to work with passenger data for which the age is known.
The notna() conditional function returns a True for each row the values are not a Null value. As such, this can be combined with the selection brackets [] to filter the data table.
You might wonder what actually changed, as the first 5 lines are still the same values. One way to verify is to check if the shape has changed:
For more dedicated functions on missing values, see the user guide section about handling missing data .
How do I select specific rows and columns from a DataFrame ?#
I’m interested in the names of the passengers older than 35 years.
In this case, a subset of both rows and columns is made in one go and just using selection brackets [] is not sufficient anymore. The loc / iloc operators are required in front of the selection brackets [] . When using loc / iloc , the part before the comma is the rows you want, and the part after the comma is the columns you want to select.
When using the column names, row labels or a condition expression, use the loc operator in front of the selection brackets [] . For both the part before and after the comma, you can use a single label, a list of labels, a slice of labels, a conditional expression or a colon. Using a colon specifies you want to select all rows or columns.
I’m interested in rows 10 till 25 and columns 3 to 5.
Again, a subset of both rows and columns is made in one go and just using selection brackets [] is not sufficient anymore. When specifically interested in certain rows and/or columns based on their position in the table, use the iloc operator in front of the selection brackets [] .
When selecting specific rows and/or columns with loc or iloc , new values can be assigned to the selected data. For example, to assign the name anonymous to the first 3 elements of the third column:
See the user guide section on different choices for indexing to get more insight in the usage of loc and iloc .
REMEMBER
When selecting subsets of data, square brackets [] are used.
Inside these brackets, you can use a single column/row label, a list of column/row labels, a slice of labels, a conditional expression or a colon.
Select specific rows and/or columns using loc when using the row and column names.
Select specific rows and/or columns using iloc when using the positions in the table.
You can assign new values to a selection based on loc / iloc .
A full overview of indexing is provided in the user guide pages on indexing and selecting data .