Моя шпаргалка по pandas
Содержание:
- Pandarallel
- Add column to dataframe in pandas using [] operator
- Conclusion
- Соединение
- Удаление
- Join DataFrames
- Create a DataFrame from List of Dicts
- Column Deletion
- Конкатенация
- О курсе
- pandas.DataFrame
- Row Selection, Addition, and Deletion
- Pandas: Insert new column to Dataframe using insert()
- Переиндексирование df.reindex()
- Pivoting — сводные таблицы
- Time-series friendly merging
- Create a DataFrame from Dict of ndarrays / Lists
- Чтение и запись данных
- Арифметика и выравнивание данных
Pandarallel
Приступим к тестированию. Сейчас и далее я буду использовать те же данные и функции для их обработки, что и в предыдущей части. Сначала настроим pandarallel — это очень просто:
Осталось только написать оптмизированную версию нашего обработчика, что тоже очень просто — достаточно заменить на :
Сравним скорость работы:
Итоги
- В глаза сразу бросается довольно большой overhead в примерно 0.5 сек. При каждом применении под капотом сначала создается, а потом закрывается пул воркеров. В самописном варианте выше я создавал пул 1 раз, а потом его переиспользовал, поэтому накладные расходы были сильно ниже.
- Если не учитывать описанные выше издержки, то ускорение такое же, как и в предыдущем варианте, примерно в 2-3 раза.
В целом, я бы предпочел этот вариант самописному, т.к при средних/больших объемах данных разницы в скорости почти нет, при этом мы получаем крайне простой API и progress bar.
Add column to dataframe in pandas using [] operator
Pandas: Add new column to Dataframe with Values in list
Suppose we want to add a new column ‘Marks’ with default values from a list. Let’s see how to do this,
# Add column with Name Marks df_obj = df_obj
Output:
Name Age City Country Marks a jack 34 Sydeny Australia 10 b Riti 30 Delhi India 20 c Vikas 31 Mumbai India 45 d Neelu 32 Bangalore India 33 e John 16 New York US 22 f Mike 17 las vegas US 11
As dataframe df_obj didn’t had any column with name ‘Marks’ , so it added a new column in this dataframe.
But we need to keep these things in mind i.e.
- If values provided in list are less than number of indexes then it will give ValueError.
- If Column already exists then it will replace all its values.
Pandas: Add new column to DataFrame with same default value
Now add a new column ‘Total’ with same value 50 in each index i.e each item in this column will have same default value 50,
df_obj = 50 df_obj
Output
Name Age City Country Marks Total a jack 34 Sydeny Australia 10 50 b Riti 30 Delhi India 20 50 c Vikas 31 Mumbai India 45 50 d Neelu 32 Bangalore India 33 50 e John 16 New York US 22 50 f Mike 17 las vegas US 11 50
It added a new column ‘Total‘ and set value 50 at each items in that column.
Pandas: Add column based on another column
Let’s add a new column ‘Percentage‘ where entry at each index will be calculated by the values in other columns at that index i.e.
df_obj = (df_obj / df_obj) * 100 df_obj
Output:
Name Age City Country Marks Total Percentage a jack 34 Sydeny Australia 10 50 20.0 b Riti 30 Delhi India 20 50 40.0 c Vikas 31 Mumbai India 45 50 90.0 d Neelu 32 Bangalore India 33 50 66.0 e John 16 New York US 22 50 44.0 f Mike 17 las vegas US 11 50 22.0
It added a new column ‘Percentage‘ , where each entry contains the percentage of that student, which was calculated based on Marks & Total column values for that index.
Conclusion
Hurray! You have come to the end of the tutorial. In this tutorial, you learned to concatenate and merge DataFrames based on several logics using the and functions of library. Towards the end, you also practiced the special function for merging Time-series DataFrames. Along the way, you also learned to play with indexes of the DataFrames. There are several other options you can explore for joining DataFrames in pandas, and I encourage you to look at its fantastic documentation. Happy exploring!
This tutorial used the following sources to help write it:
https://pandas.pydata.org/pandas-docs/stable/merging.html
If you would like to learn more about pandas, take DataCamp’s pandas Foundations course.
Соединение
Операция соединения (), которая соответствует из SQL, состоит из объединения данных за счет соединения строк на основе одного или нескольких ключей.
На самом деле, любой, кто работал с реляционными базами данных, обычно использует запрос из SQL для получения данных из разных таблиц с помощью ссылочных значений (ключей) внутри них. На основе этих ключей можно получать новые данные в табличной форме как результат объединения других таблиц. Эта операция в библиотеке pandas называется соединением (merging), а — функция для ее выполнения.
Сначала нужно импортировать библиотеку pandas и определить два объекта , которые будут примерами в этом разделе.
Выполним соединение, применив функцию к двум объектам.

Получившийся объект состоит из всех строк с общим . В дополнение к общей колонке добавлены и те, что присутствуют только в первом и втором объектах.
В этом случае функция была использована без явного определения колонок. Но чаще всего необходимо указывать, на основе какой колонки выполнять соединение.
Для этого нужно добавить свойство с названием колонки, которое будет ключом соединения.
В этом случае два объекта имеют колонки с одинаковыми названиями. Поэтому при запуске результата не будет.
Необходимо явно задавать условия соединения, которым pandas будет следовать, определяя название ключа в параметре .
Как и ожидалось, результаты отличаются в зависимости от условий соединения.
Но часто появляется другая проблема, когда есть два без колонок с одинаковыми названиями. Для исправления ситуации нужно использовать и , которые определяют ключевые колонки для первого и второго объектов . Дальше следует пример.
По умолчанию функция выполняет (внутреннее соединение). Ключ в финальном объекте — результат пересечения.
Другие возможные варианты: , и (левое, правое и внешнее соединение). Внешнее выполняет объединение всех ключей, комбинируя эффекты правого и левого соединений. Для выбора типа нужно использовать параметр .
Для соединения нескольких ключей, нужно просто в параметр on добавить список.
Удаление
Еще одна операция, связанная с объектами — удаление. Удалить строку или колонку не составит труда, потому что метки используются для обозначения индексов и названий колонок.
В этом случае pandas предоставляет специальную функцию для этой операции, которая называется . Метод возвращает новый объект без элементов, которые необходимо было удалить.
Например, возьмем в качестве примера случай, где из объекта нужно удалить один элемент. Для этого определим базовый объект из четырех элементов с 4 отдельными метками.
Теперь, предположим, необходимо удалить объект с меткой . Для этого нужно всего лишь указать ее в качестве аргумента функции .
Для удаления большего количества элементов, передайте массив с соответствующими индексами.
Если речь идет об объекте , значения могут быть удалены с помощью ссылок на метки обеих осей. Возьмем в качестве примера следующий объект.
| ball | pen | pencil | paper | |
|---|---|---|---|---|
| red | 1 | 2 | 3 | |
| blue | 4 | 5 | 6 | 7 |
| yellow | 8 | 9 | 10 | 11 |
| white | 12 | 13 | 14 | 15 |
Для удаления строк просто передайте индексы строк.
| ball | pen | pencil | paper | |
|---|---|---|---|---|
| red | 1 | 2 | 3 | |
| white | 12 | 13 | 14 | 15 |
Для удаления колонок необходимо указывать индексы колонок, а также ось, с которой требуется удалить элементы. Для этого используется параметр . Чтобы сослаться на название колонки, нужно написать .
| ball | paper | |
|---|---|---|
| red | 3 | |
| blue | 4 | 7 |
| yellow | 8 | 11 |
| white | 12 | 15 |
Join DataFrames
In this section, you will practice the various join logics available to merge pandas DataFrames based on some common column/key. The logic behind these joins is very much the same that you have in SQL when you join tables.
Full Outer Join
The combines the results of both the left and the right outer joins. The joined DataFrame will contain all records from both the DataFrames and fill in s for missing matches on either side. You can perform a full outer join by specifying the argument as in the function:
| id | Feature1_x | Feature2_x | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|
| 1 | A | B | K | L | |
| 1 | 2 | C | D | M | N |
| 2 | 3 | E | F | NaN | NaN |
| 3 | 4 | G | H | NaN | NaN |
| 4 | 5 | I | J | NaN | NaN |
| 5 | 6 | NaN | NaN | O | P |
| 6 | 7 | NaN | NaN | Q | R |
| 7 | 8 | NaN | NaN | S | T |
You can notice that the resulting DataFrame had all the entries from both the tables with values for missing matches on either side. However, one more thing to notice is the suffix which got appended to the column names to show which column came from which DataFrame. The default suffixes are and , however, you can modify them by specifying the argument in the function:
| id | Feature1_left | Feature2_left | Feature1_right | Feature2_right | |
|---|---|---|---|---|---|
| 1 | A | B | K | L | |
| 1 | 2 | C | D | M | N |
| 2 | 3 | E | F | NaN | NaN |
| 3 | 4 | G | H | NaN | NaN |
| 4 | 5 | I | J | NaN | NaN |
| 5 | 6 | NaN | NaN | O | P |
| 6 | 7 | NaN | NaN | Q | R |
| 7 | 8 | NaN | NaN | S | T |
Inner Join
The produces only the set of records that match in both DataFrame A and DataFrame B. You have to pass in the argument of function to do inner join:
| id | Feature1_x | Feature2_x | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|
| 1 | A | B | K | L | |
| 1 | 2 | C | D | M | N |
Right Join
The produces a complete set of records from DataFrame B (right DataFrame), with the matching records (where available) in DataFrame A (left DataFrame). If there is no match, the right side will contain null. You have to pass in the argument of function to do right join:
| id | Feature1_x | Feature2_x | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|
| 1 | A | B | K | L | |
| 1 | 2 | C | D | M | N |
| 2 | 6 | NaN | NaN | O | P |
| 3 | 7 | NaN | NaN | Q | R |
| 4 | 8 | NaN | NaN | S | T |
Left Join
The produces a complete set of records from DataFrame A (left DataFrame), with the matching records (where available) in DataFrame B (right DataFrame). If there is no match, the left side will contain null. You have to pass in the argument of function to do left join:
| id | Feature1_x | Feature2_x | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|
| 1 | A | B | K | L | |
| 1 | 2 | C | D | M | N |
| 2 | 3 | E | F | NaN | NaN |
| 3 | 4 | G | H | NaN | NaN |
| 4 | 5 | I | J | NaN | NaN |
Joining on index
Sometimes you may have to perform the join on the indexes or the row labels. To do so, you have to specify (for the indexes of the right DataFrame) and (for the indexes of the left DataFrame) as :
| id_x | Feature1_x | Feature2_x | id_y | Feature1_y | Feature2_y | |
|---|---|---|---|---|---|---|
| 1 | A | B | 1 | K | L | |
| 1 | 2 | C | D | 2 | M | N |
| 2 | 3 | E | F | 6 | O | P |
| 3 | 4 | G | H | 7 | Q | R |
| 4 | 5 | I | J | 8 | S | T |
Create a DataFrame from List of Dicts
List of Dictionaries can be passed as input data to create a DataFrame. The dictionary keys are by default taken as column names.
Example 1
The following example shows how to create a DataFrame by passing a list of dictionaries.
import pandas as pd data = df = pd.DataFrame(data) print df
Its output is as follows −
a b c
0 1 2 NaN
1 5 10 20.0
Note − Observe, NaN (Not a Number) is appended in missing areas.
Example 2
The following example shows how to create a DataFrame by passing a list of dictionaries and the row indices.
import pandas as pd data = df = pd.DataFrame(data, index=) print df
Its output is as follows −
a b c
first 1 2 NaN
second 5 10 20.0
Example 3
The following example shows how to create a DataFrame with a list of dictionaries, row indices, and column indices.
import pandas as pd data = #With two column indices, values same as dictionary keys df1 = pd.DataFrame(data, index=, columns=) #With two column indices with one index with other name df2 = pd.DataFrame(data, index=, columns=) print df1 print df2
Its output is as follows −
#df1 output
a b
first 1 2
second 5 10
#df2 output
a b1
first 1 NaN
second 5 NaN
Note − Observe, df2 DataFrame is created with a column index other than the dictionary key; thus, appended the NaN’s in place. Whereas, df1 is created with column indices same as dictionary keys, so NaN’s appended.
Column Deletion
Columns can be deleted or popped; let us take an example to understand how.
Example
# Using the previous DataFrame, we will delete a column
# using del function
import pandas as pd
d = {'one' : pd.Series(, index=),
'two' : pd.Series(, index=),
'three' : pd.Series(, index=)}
df = pd.DataFrame(d)
print ("Our dataframe is:")
print df
# using del function
print ("Deleting the first column using DEL function:")
del df
print df
# using pop function
print ("Deleting another column using POP function:")
df.pop('two')
print df
Its output is as follows −
Our dataframe is:
one three two
a 1.0 10.0 1
b 2.0 20.0 2
c 3.0 30.0 3
d NaN NaN 4
Deleting the first column using DEL function:
three two
a 10.0 1
b 20.0 2
c 30.0 3
d NaN 4
Deleting another column using POP function:
three
a 10.0
b 20.0
c 30.0
d NaN
Конкатенация
Еще один тип объединения данных — конкатенация. NumPy предоставляет функцию для ее выполнения.
С библиотекой pandas и ее структурами данных, такими как и , именованные оси позволяют и дальше обобщать конкатенацию массивов. Для этого в pandas есть функция .
По умолчанию функция работает на и возвращает объект . Если задать значением , то результатом будет объект .
Проблема с этой операцией в том, что конкатенированные части не определяются в итоговом объекте. Например, нужно создать иерархический индекс на оси конкатенации. Для этого требуется использовать параметр .
В случае объединения двух по ключи становятся заголовками колонок объекта .
Пока что в примерах конкатенация применялась только к объектам , но та же логика работает и с .
О курсе
Мы не ставим себе задачу разработать еще один исчерпывающий вводный курс по машинному обучению или анализу данных (т.е. это не замена специализации Яндекса и МФТИ, дополнительному образованию ВШЭ и прочим фундаментальным онлайн- и оффлайн-программам и книжкам). Цель этой серии статей — быстро освежить имеющиеся у вас знания или помочь найти темы для дальнейшего изучения. Подход примерно как у авторов книги Deep Learning, которая начинается с обзора математики и основ машинного обучения — краткого, максимально ёмкого и с обилием ссылок на источники.
Если вы планируете пройти курс, то предупреждаем: при подборе тем и создании материалов мы ориентируемся на то, что наши слушатели знают математику на уровне 2 курса технического вуза и хотя бы немного умеют программировать на Python. Это не жёсткие критерии отбора, а всего лишь рекомендации — можно записаться на курс, не зная математики или Python, и параллельно навёрстывать:
- базовую математику (математический анализ, линейную алгебру, оптимизацию, теорвер и статистику) можно повторить по этим конспектам Yandex & MIPT (делимся с разрешения). Кратко, на русском – то что надо. Если подробно, то матан – Кудрявцев, линал – Кострикин, оптимизация – Boyd (англ.), теорвер и статистика – Кибзун. Плюс отличные онлайн-курсы МФТИ и ВШЭ на Coursera;
- по Python хватит небольшого интерактивного туториала на Datacamp или этого репозитория по Python и базовым алгоритмам и структурам данных. Что-то более продвинутое – это, например, курс питерского Computer Science Center;
- что касается машинного обучения, то есть классический (но слегка устаревший) курс Andrew Ng «Machine Learning»(Stanford, Coursera). На русском языке есть отличная специализация МФТИ и Яндекса «Машинное обучение и анализ данных». А вот и лучшие книги: «Pattern recognition and Machine Learning» (Bishop), «Machine Learning: A Probabilistic Perspective » (Murphy), «The elements of statistical learning» (Hastie, Tibshirani, Friedman), «Deep Learning» (Goodfellow, Bengio, Courville). Книга Goodfellow начинается с обзора математики и понятного и интересного введения в машинное обучение и внутреннее устройство его алгоритмов. Приятно, что теперь про глубокое обучение есть книга и на русском языке – «Глубокое обучение: погружение в мир нейронных сетей» (Николенко С. И., Кадурин А. А., Архангельская Е. О.).
Также про курс рассказано в этом анонсе.
Какое ПО нужно
Для прохождения курса нужен ряд Python-пакетов, большинство из них есть в сборке Anaconda с Python 3.6. Чуть позже понадобятся и другие библиотеки, об этом будет сказано дополнительно. Полный список можно посмотреть в Dockerfile.
Также можно воспользоваться Docker-контейнером, в котором все необходимое ПО уже установлено. Подробности – на странице Wiki репозитория.
Как подключиться к курсу
Никакой формальной регистрации не требуется, подключиться к курсу можно в любой момент после начала (01.10.18 г.), но дедлайны по домашним заданиям жесткие.
Но чтоб мы о вас больше знали:
- Заполните опрос, указав в нем реальное ФИО;
- Вступите в сообщество OpenDataScience, обсуждение курса ведется в канале #mlcourse.ai.
pandas.DataFrame
A pandas DataFrame can be created using the following constructor −
pandas.DataFrame( data, index, columns, dtype, copy)
The parameters of the constructor are as follows −
| Sr.No | Parameter & Description |
|---|---|
| 1 |
data data takes various forms like ndarray, series, map, lists, dict, constants and also another DataFrame. |
| 2 |
index For the row labels, the Index to be used for the resulting frame is Optional Default np.arange(n) if no index is passed. |
| 3 |
columns For column labels, the optional default syntax is — np.arange(n). This is only true if no index is passed. |
| 4 |
dtype Data type of each column. |
| 5 |
copy This command (or whatever it is) is used for copying of data, if the default is False. |
Row Selection, Addition, and Deletion
We will now understand row selection, addition and deletion through examples. Let us begin with the concept of selection.
Selection by Label
Rows can be selected by passing row label to a loc function.
import pandas as pd
d = {'one' : pd.Series(, index=),
'two' : pd.Series(, index=)}
df = pd.DataFrame(d)
print df.loc
Its output is as follows −
one 2.0 two 2.0 Name: b, dtype: float64
The result is a series with labels as column names of the DataFrame. And, the Name of the series is the label with which it is retrieved.
Selection by integer location
Rows can be selected by passing integer location to an iloc function.
import pandas as pd
d = {'one' : pd.Series(, index=),
'two' : pd.Series(, index=)}
df = pd.DataFrame(d)
print df.iloc
Its output is as follows −
one 3.0 two 3.0 Name: c, dtype: float64
Slice Rows
Multiple rows can be selected using ‘ : ’ operator.
import pandas as pd
d = {'one' : pd.Series(, index=),
'two' : pd.Series(, index=)}
df = pd.DataFrame(d)
print df
Its output is as follows −
one two c 3.0 3 d NaN 4
Addition of Rows
Add new rows to a DataFrame using the append function. This function will append the rows at the end.
import pandas as pd df = pd.DataFrame(, ], columns = ) df2 = pd.DataFrame(, ], columns = ) df = df.append(df2) print df
Its output is as follows −
a b 0 1 2 1 3 4 0 5 6 1 7 8
Deletion of Rows
Use index label to delete or drop rows from a DataFrame. If label is duplicated, then multiple rows will be dropped.
If you observe, in the above example, the labels are duplicate. Let us drop a label and will see how many rows will get dropped.
import pandas as pd df = pd.DataFrame(, ], columns = ) df2 = pd.DataFrame(, ], columns = ) df = df.append(df2) # Drop rows with label 0 df = df.drop(0) print df
Its output is as follows −
a b 1 3 4 1 7 8
In the above example, two rows were dropped because those two contain the same label 0.
Previous Page
Print Page
Next Page
Pandas: Insert new column to Dataframe using insert()
First of all reset dataframe i.e.
# Create a DataFrame object df_obj = pd.DataFrame(students, columns=, index=)
Contents dataframe df_obj are,
Name Age City Country a jack 34 Sydeny Australia b Riti 30 Delhi India c Vikas 31 Mumbai India d Neelu 32 Bangalore India e John 16 New York US f Mike 17 las vegas US
In all the previous solution, we added new column at the end of the dataframe, but suppose we want to add or insert a new column in between the other columns of the dataframe, then we can use the insert() function i.e.
# Insert column at the 2nd position of Dataframe df_obj.insert(2, "Marks", , True) df_obj
Output:
Name Age Marks City Country a jack 34 10 Sydeny Australia b Riti 30 20 Delhi India c Vikas 31 45 Mumbai India d Neelu 32 33 Bangalore India e John 16 22 New York US f Mike 17 11 las vegas US
It inserted the column ‘Marks’ in between other columns.
Переиндексирование df.reindex()
Вы уже знаете, что после объявления в структуре данных объект нельзя менять. Но с помощью операции переиндексирования это можно решить.
Существует даже возможность получить новую структуру из уже существующей, где правила индексирования заданы заново.
Для того чтобы провести переиндексирование объекта библиотека pandas предоставляет функцию . Она создает новый объект со значениями из другого , которые теперь переставлены в соответствии с новой последовательностью меток.
При операции переиндексирования можно поменять порядок индексов, удалить некоторые из них или добавить новые. Если метка новая, pandas добавит на место соответствующего значения.
Как видно по выводу, порядок меток можно поменять полностью. Значение, которое раньше соответствовало метке , удалено, зато есть новое с меткой .

Тем не менее в случае, например, с большим , не совсем удобно будет указывать новый список меток. Вместо этого можно использовать метод, который заполняет или интерполирует значения автоматически.
Для лучшего понимания механизма работы этого режима автоматического индексирования создадим следующий объект .
В этом примере видно, что колонка с индексами — это не идеальная последовательность чисел. Здесь пропущены цифры 1, 2 и 4. В таком случае нужно выполнить операцию интерполяции и получить полную последовательность чисел. Для этого можно использовать с параметром равным . Более того, необходимо задать диапазон значений для индексов. Тут можно использовать в качестве аргумента.
Теперь в объекте есть элементы, которых не было в оригинальном объекте . Операция интерполяции сделала так, что наименьшие индексы стали значениями в объекте. Так, индексы 1 и 2 имеют значение 1, принадлежащее индексу 0.
Если нужно присваивать значения индексов при интерполяции, необходимо использовать метод .
В этом случае значения индексов 1 и 2 равны 5, которое принадлежит индексу 3.
Операция отлично работает не только с , но и с . Переиндексирование можно проводить не только на индексах (строках), но также и на колонках или на обоих. Как уже отмечалось, добавлять новые индексы и колонки возможно, но поскольку в оригинальной структуре есть недостающие значения, на их месте будет .
| item | colors | price | new | object |
|---|---|---|---|---|
| id | ||||
| blue | 1.2 | blue | ball | |
| 1 | green | 1.0 | green | pen |
| 2 | yellow | 3.3 | yellow | pencil |
| 3 | red | 0.9 | red | paper |
| 4 | white | 1.7 | white | mug |
Pivoting — сводные таблицы
В дополнение к сборке данных для унификации собранных из разных источников значений часто применяется операция поворота. На самом деле, выравнивание данных по строке и колонке не всегда подходит под конкретную ситуацию. Иногда требуется перестроить данные по значениям колонок в строках или наоборот.
Поворот с иерархическим индексированием
Вы уже знаете, что поддерживает иерархическое индексирование. Эта особенность может быть использована для перестраивания данных в объекте . В контексте поворота есть две базовые операции:
- Укладка (stacking) — поворачивает структуру данных, превращая колонки в строки
- Обратный процесс укладки (unstacking) — конвертирует строки в колонки
С помощью функции в можно развернуть данные и превратить колонки в строки, получив :
Из объекта с иерархическим индексировании можно выполнить пересборку в развернутую таблицу с помощью .
Обратный процесс можно выполнить и на другом уровне, определив количество уровней или название в качестве аргумента функции.
Поворот из «длинного» в «широкий» формат
Наиболее распространенный способ хранения наборов данных — точная регистрация данных, которые будут заполнять строки текстового файла: CSV или таблицы в базе данных. Это происходит особенно в таких случаях: чтение выполняется с помощью инструментов; результаты вычислений итерируются; или данные вводятся вручную. Похожий пример таких файлов — логи, заполняемые строка за строкой с помощью постоянно поступающих данных.
Необычная особенность этого типа набора данных — элементы разных колонок, часто повторяющиеся в последующих строках. Они всегда в табличной форме, поэтому их можно воспринимать как формат длинных или упакованных.
Чтобы лучше разобраться с этой концепцией, рассмотрим следующий .
Этот режим записи данных имеет свои недостатки. Первый — повторение некоторых полей. Если воспринимать колонки в качестве ключей, то данные в этом формате будет сложно читать, а особенно — понимать отношения между значениями ключей и остальными колонками.
Но существует замена для длинного формата — широкий способ организации данных в таблице. В таком режиме данные легче читать, а также налаживать связь между таблицами. Плюс, они занимают меньше места. Это более эффективный способ хранения данных, пусть и менее практичный, особенно на этапе заполнения объекта данными.
В качестве критерия нужно выбрать колонку или несколько из них как основной ключ. Значения в них должны быть уникальными.
pandas предоставляет функцию, которая позволяет выполнить трансформацию из длинного типа в широкий. Она называется , а в качестве аргументов принимает одну или несколько колонок, которые будут выполнять роль ключа.
Еще с прошлого примера вы создавали в широком формате. Колонка выступала основным ключом, – вторым, а их значения формировали новые колонки в объекте.
В таком формате более компактен, а данные в нем — куда более читаемые.
Time-series friendly merging
Pandas provides special functions for merging Time-series DataFrames. Perhaps the most useful and popular one is the function. The is similar to an ordered left-join except that you match on nearest key rather than equal keys. For each row in the left DataFrame, you select the last row in the right DataFrame whose key is less than the left’s key. Both DataFrames must be sorted by the key.
Optionally an asof merge can perform a group-wise merge. This matches the key equally, in addition to the nearest match on the key.
For example, you might have trades and quotes, and you want to asof merge them. Here the left DataFrame is chosen as and right DataFrame as . They are asof merged on key and group-wise merged by their symbol.
| time | ticker | price | quantity | |
|---|---|---|---|---|
| 2016-05-25 13:30:00.023 | MSFT | 51.95 | 75 | |
| 1 | 2016-05-25 13:30:00.038 | MSFT | 51.95 | 155 |
| 2 | 2016-05-25 13:30:00.048 | GOOG | 720.77 | 100 |
| 3 | 2016-05-25 13:30:00.048 | GOOG | 720.92 | 100 |
| 4 | 2016-05-25 13:30:00.048 | AAPL | 98.00 | 100 |
| time | ticker | bid | ask | |
|---|---|---|---|---|
| 2016-05-25 13:30:00.023 | GOOG | 720.50 | 720.93 | |
| 1 | 2016-05-25 13:30:00.023 | MSFT | 51.95 | 51.96 |
| 2 | 2016-05-25 13:30:00.030 | MSFT | 51.97 | 51.98 |
| 3 | 2016-05-25 13:30:00.041 | MSFT | 51.99 | 52.00 |
| 4 | 2016-05-25 13:30:00.048 | GOOG | 720.50 | 720.93 |
| 5 | 2016-05-25 13:30:00.049 | AAPL | 97.99 | 98.01 |
| 6 | 2016-05-25 13:30:00.072 | GOOG | 720.50 | 720.88 |
| 7 | 2016-05-25 13:30:00.075 | MSFT | 52.01 | 52.03 |
| time | ticker | price | quantity | bid | ask | |
|---|---|---|---|---|---|---|
| 2016-05-25 13:30:00.023 | MSFT | 51.95 | 75 | 51.95 | 51.96 | |
| 1 | 2016-05-25 13:30:00.038 | MSFT | 51.95 | 155 | 51.97 | 51.98 |
| 2 | 2016-05-25 13:30:00.048 | GOOG | 720.77 | 100 | 720.50 | 720.93 |
| 3 | 2016-05-25 13:30:00.048 | GOOG | 720.92 | 100 | 720.50 | 720.93 |
| 4 | 2016-05-25 13:30:00.048 | AAPL | 98.00 | 100 | NaN | NaN |
If you observe carefully, you can notice the reason behind appearing in the ticker row. Since the right DataFrame didn’t have any value less than (the in the left table) for ticker, s were introduced in the and columns.
You can also set a predefined tolerance level for column. Suppose you only want asof merge within 2ms between the time and the time, then you will have to specify argument:
| time | ticker | price | quantity | bid | ask | |
|---|---|---|---|---|---|---|
| 2016-05-25 13:30:00.023 | MSFT | 51.95 | 75 | 51.95 | 51.96 | |
| 1 | 2016-05-25 13:30:00.038 | MSFT | 51.95 | 155 | NaN | NaN |
| 2 | 2016-05-25 13:30:00.048 | GOOG | 720.77 | 100 | 720.50 | 720.93 |
| 3 | 2016-05-25 13:30:00.048 | GOOG | 720.92 | 100 | 720.50 | 720.93 |
| 4 | 2016-05-25 13:30:00.048 | AAPL | 98.00 | 100 | NaN | NaN |
Notice the difference between the above and previous result. Rows are not merged if the time tolerance didn’t match .
Create a DataFrame from Dict of ndarrays / Lists
All the ndarrays must be of same length. If index is passed, then the length of the index should equal to the length of the arrays.
If no index is passed, then by default, index will be range(n), where n is the array length.
Example 1
import pandas as pd
data = {'Name':,'Age':}
df = pd.DataFrame(data)
print df
Its output is as follows −
Age Name
0 28 Tom
1 34 Jack
2 29 Steve
3 42 Ricky
Note − Observe the values 0,1,2,3. They are the default index assigned to each using the function range(n).
Example 2
Let us now create an indexed DataFrame using arrays.
import pandas as pd
data = {'Name':,'Age':}
df = pd.DataFrame(data, index=)
print df
Its output is as follows −
Age Name
rank1 28 Tom
rank2 34 Jack
rank3 29 Steve
rank4 42 Ricky
Note − Observe, the index parameter assigns an index to each row.
Чтение и запись данных
pandas поддерживает все самые популярные форматы хранения данных: csv, excel, sql, буфер обмена, html и многое другое:
Чаще всего приходится работать с csv-файлами. Например, чтобы сохранить наш DataFrame со странами, достаточно написать:
Функции to_csv ещё передаются различные аргументы (например, символ разделителя между колонками) о которых подробнее можно узнать в официальной документации.
Считать данные из csv-файла и превратить в DataFrame можно функцией read_csv.
Аргумент sep указывает разделитесь столбцов. Существует ещё масса способов сформировать DataFrame из различных источников, но наиболее часто используют CSV, Excel и SQL. Например, с помощью функции read_sql, pandas может выполнить SQL запрос и на основе ответа от базы данных сформировать необходимый DataFrame. За более подробной информацией стоит обратиться к официальной документации.
Арифметика и выравнивание данных
Наверное, самая важная особенность индексов в этой структуре данных — тот факт, что pandas может выравнивать индексы двух разных структур
Это особенно важно при выполнении арифметических операций на их значениях. В этом случае индексы могут быть не только в разном порядке, но и присутствовать лишь в одной из двух структур
В качестве примера можно взять два объекта с разными метками.
Теперь воспользуемся базовой операцией сложения. Как видно по примеру, некоторые метки есть в обоих структурах, а остальные — только в одной. Если они есть в обоих случаях, их значения складываются, а если только в одном — то значением будет .
При использовании выравнивание работает по тому же принципу, но проводится и для рядов, и для колонок.
| ball | pen | pencil | paper | |
|---|---|---|---|---|
| red | 1 | 2 | 3 | |
| blue | 4 | 5 | 6 | 7 |
| yellow | 8 | 9 | 10 | 11 |
| white | 12 | 13 | 14 | 15 |
| mug | pen | ball | |
|---|---|---|---|
| blue | 1 | 2 | |
| green | 3 | 4 | 5 |
| white | 6 | 7 | 8 |
| yellow | 9 | 10 | 11 |



