Практически с момента появления Питон активно используется для предобработки данных (например, прочитать текстовый файл и выделить из него нужные куски, очистить текст от лишних символов и т.д.) Очищенные данные можно позже направить, например, в табличный процессор, СУБД или статистическую систему для последующего анализа.
Библиотека pandas добавляет в Питон значительную часть аналитической функциональности больших пакетов.
Обычно мы будем сразу подключать эти модули для работы (добавить в начало файла):
import pandas as pd import numpy as np import matplotlib.pyplot as plt
Можно создать серию (Series) передав список значений, для этого списка pandas самостоятельно создаст индекс (присвоит каждому элементу уникальный номер)
s = pd.Series([1,3,5,np.nan,6,8]) print(s)
0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64
При создании объекта можно не полагаться на автоматический генератор индекса из pangas и указать свой.
Сначала создадим диапазон дан с помощью функции date_range из pandas
dates = pd.date_range('20130101', periods=6) # создаст диапазон из 6 дней, начиная с 1 января 2013 года print(dates) df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD')) # создаст датафрейм из таблицы, размера 6 строк на 4 столбца (np.random.randn(6,4)), попросит в качестве индекса для строк использовать значения из переменной dates (index=dates), а для столбцов - список из четырех букв print(df)
A B C D 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 2013-01-06 -0.673690 0.113648 -1.478427 0.524988
При создании датафрейма можно передать словарь объектов, который будет преобразован в серию
df2 = pd.DataFrame({ 'A' : 1., # одиночное вещественное число 'B' : pd.Timestamp('20130102'), # дата 'C' : pd.Series(1,index=list(range(4)),dtype='float32'), # список из четырех единиц с вещественным типом 'D' : np.array([3] * 4,dtype='int32'), # 4 раза повторяется список из целочисленных троек 'E' : pd.Categorical(["test","train","test","train"]), # специальный тип, который хранит в себе категории, иными словами текстовые метки для данных 'F' : 'foo' }) # произвольная строка print(df2)
A B C D E F 0 1.0 2013-01-02 1.0 3 test foo 1 1.0 2013-01-02 1.0 3 train foo 2 1.0 2013-01-02 1.0 3 test foo 3 1.0 2013-01-02 1.0 3 train foo
Каждая колонка в датафрейме имеет свой тип, который определен внутри pandas. Узнать его можно с помощью функции dtypes
print(df2.dtypes)
A float64 B datetime64[ns] C float32 D int32 E category F object dtype: object
Просмотрим начальные и конечные строки в датафрейме. Функция head без аргументов вернет 5 первых строк, а tails с аргументом 3 - три последних
print(df.head())
A B C D 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 2013-01-05 -0.424972 0.567020 0.276232 -1.087401
print(df.tail(3))
A B C D 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 2013-01-06 -0.673690 0.113648 -1.478427 0.524988
С помощью функций index, columns и values можно просмотреть значения индексов (имена строк), имена колонок и значения внутри таблицы.
print(df.index) print(df.columns) print(df.values)
Функция describe() покажет краткую сводку о данных
print(df.describe())
A B C D count 6.000000 6.000000 6.000000 6.000000 # количество строк mean 0.073711 -0.431125 -0.687758 -0.233103 # среднее значение элементов в столбце std 0.843157 0.922818 0.779887 0.973118 # стандартное отклонение для каждого элемента min -0.861849 -2.104569 -1.509059 -1.135632 # наименьший элемент 25% -0.611510 -0.600794 -1.368714 -1.076610 # 25 перцентиль 50% 0.022070 -0.228039 -0.767252 -0.386188 # 50 перцентиль или медиана 75% 0.658444 0.041933 -0.034326 0.461706 # 75 перцентиль max 1.212112 0.567020 0.276232 1.071804 # наибольший элемент
Транспонировать таблицу (отразить относительно диагонали)
print(df.T)
2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06 A 0.469112 1.212112 -0.861849 0.721555 -0.424972 -0.673690 B -0.282863 -0.173215 -2.104569 -0.706771 0.567020 0.113648 C -1.509059 0.119209 -0.494929 -1.039575 0.276232 -1.478427 D -1.135632 -1.044236 1.071804 0.271860 -1.087401 0.524988
Упорядочить по направлению (например, по имени столбца)
print(df.sort_index(axis=1, ascending=False))
D C B A 2013-01-01 -1.135632 -1.509059 -0.282863 0.469112 2013-01-02 -1.044236 0.119209 -0.173215 1.212112 2013-01-03 1.071804 -0.494929 -2.104569 -0.861849 2013-01-04 0.271860 -1.039575 -0.706771 0.721555 2013-01-05 -1.087401 0.276232 0.567020 -0.424972 2013-01-06 0.524988 -1.478427 0.113648 -0.673690
Упорядочить по значению элементов столбца (например по столбцу B)
print(df.sort_values(by='B'))
A B C D 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 2013-01-06 -0.673690 0.113648 -1.478427 0.524988 2013-01-05 -0.424972 0.567020 0.276232 -1.087401
Строки можно перебрать и с помощью цикла for, для этого нужно воспользоваться функцией iterrows
for index,row in df.iterrows(): print(row['A'])
Выбор данных из колонок и стобцов очень похож на работу с списками. Одна колонка
print(df['A'])
Диапазон строк по номеру
print(df[0:3])
Диапазон строк по значению индекса
print(df['20130102':'20130104'])
Для сечения таблицы по метке используется функция loc, например, получим все значения для строки, индекс которой совпадает с нулевым элементом списка dates (мы его создавали в самом начале)
print(df.loc[dates[0]])
Никто не мешает нам выбрать одновременно по двум осям - строкам и столбцам. Выберем подтаблицу, которая содержит все строки и два столбца
print(df.loc[:,['A','B']])
Или только три строки
print(df.loc['20130102':'20130104',['A','B']])
Одно значение из таблицы получим с помощью
print(df.loc[dates[0],'A'])
Для получения по позиции или по номеру используется функция iloc. Возьмем третью строку
print(df.iloc[3])
Или строки с третьей по четвертую и столбцы с нулевого по первый (внимание, что правые границы диапазонов, т.е. строка с номером 5 и столбец с номером два, не включаются в результат)
print(df.iloc[3:5,0:2])
Вместо диапазонов можно указать конкретные строки или столбцы, например
print(df.iloc[df.iloc[[1,2,4],[0,2]]])
Или же, например, получить несколько строк полностью
print(df.iloc[df.iloc[1:3,:]])
Аналогично со столбцами
print(df.iloc[:,1:3])
Выберем из таблица все строки, где значения из колонки А положительны
print(df[df.A > 0])
Или только положительные данные во всей таблице
print(df[df > 0])
A B C D 2013-01-01 0.469112 NaN NaN NaN 2013-01-02 1.212112 NaN 0.119209 NaN 2013-01-03 NaN NaN NaN 1.071804 2013-01-04 0.721555 NaN NaN 0.271860 2013-01-05 NaN 0.567020 0.276232 NaN 2013-01-06 NaN 0.113648 NaN 0.524988
Обратите внимание, что все отрицательные элементы были заменены на NaN. Специальный тип данных, указывающий на отсутствие значения.
Функция isin сверяет значения из строки или столбца со списком, и возвращает только те, которые содержатся и там, и там
df2 = df.copy() # функция copy копирует данные из одного датафрейма в другой df2['E'] = ['one', 'one','two','three','four','three'] # добавим новый столбец с именем Е и присвоим ему значения из списка print(df2) print(df2['E'].isin(['two','four'])) # выделим из нашей таблицы только те строки, которые содержат слова two и four в столбце Е
A B C D E 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 one 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 one 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 two 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 three 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 four 2013-01-06 -0.673690 0.113648 -1.478427 0.524988 three A B C D E 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 two 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 four
Представить столбец в виде списка
l = df['Column'].to_list()
Чтение CSV файла делается в одну строку
pd.read_csv('foo.csv')
Найти всех легендарных покемонов.
Найти всех производителей шоколада, относящихся к конкретной стране и напечатать их на экран в виде
Страна1 Производитель1.1 Производитель1.2 Страна2 Производитель2.1 Производитель2.2 Производитель2.3