Конспект про Pandas

Упражнения — https://github.com/guipsamora/pandas_exercises (видео разбор этих упражнений — [https://www.youtube.com/watch?v=pu3IpU937xs&list=PLgJhDSE2ZLxaY_DigHeiIDC1cD09rXgJv](https://www.youtube.com/watch?v=pu3IpU937xs&list=PLgJhDSE2ZLxaY_DigHeiIDC1cD09rXgJv]

Series - Pandas

В Pandas есть две главные структуры для хранения данных:

  • Series
  • Dataframe

В jupyter можно посмотреть справку с помощью вопросительного знака

pd.Series?

Объект Series сильно напоминает колонку в Excel. Есть:

  • данные
  • индекс
  • название

Создать:

s1 = pd.Series(data=[5,3,4])
s2 = pd.Series([5,3,4])
s3 = pd.Series(dtype='object') # пустой

s4 = pd.Series(
    np.random.randn(5),
    index=['a','b','c','d','e'],
    name="example")

Обычно Series и Dataframe не создаются руками, а загружаются откуда-то извне, а вот различные преобразования Series и Dataframe использются очень часто.

Поле name в Series может использоваться для того чтобы назвать колонку в случае создания Dataframe из Series, пример:

df = pd.DataFrame(pd.Series([1,2,3],name="sample"))

Пример broadcasting. Указано только одно число, но оно будет размещено во всех позициях Series:

s = pd.Series(5, index=['a', 'c', 'd', 'e', 'f'])

get actual underlying data:

s.values

Получить одно значение

array-like properties:

s[0] # получить первый элемент

получить элемент по индексу:

s['a']

Получить несколько значений

slice:

s[:3]

достать несколько элементов из Series:

s[[4,3]]
s[[True,False,False,True,True]]

s[s>3]

Изменеие

Одно значение:

s['a'] = 89
s[3] = 10

измнение нескольких значений:

s[s>3] *= -1

Операции

np.exp(s)
s.abs()
s.mean()

Есть автокомплит в jupyter который показывает какие есть методы.

При операциях над несколькими сериями легко можно получить NaN, если в сериях разные индексы

s + s[s>3]

DataFrames - Pandas

higly-dimentional data - different columns

Dataframe is a combination of Series.

Состоит из трех вещей:

  • columns
  • index
  • data

Будет NaN в колонке one:

d = { 'one': pd.Series([1,2],index=['a','b'],),
    'two': pd.Series([4,5,6],index=['a','b','c'],),}
df = pd.DataFrame(d)
df

Можно собрать из единственного значения (размножится на все строки) или np.array:

d = {'one' : 'Hellow',
    'two' : np.array([1., 2., 3., 4.])}

df = pd.DataFrame(d)
df

Можно получить колонки/индекс:

df.columns
df.index

и можно их поменять:

df.columns = ['aa', 'bb']
df.index = ['a', 'b', 'c', 'd']

Удалить колонку:

del df['aa']

Создание новых колонок:

df['three'] = df['two'] + df['two']
df['four'] = 'four'
df['five'] = df['four'][:2]

Получить данные.

Получить Series из Dataframe:

df['one']

Сделать новый Dataframe только из указанных колонок оригинального:

df[['five', 'two']]

Получить одно значение с помощью loc - cначала указывается индекс, потом колонка

df.loc['a', 'two']

Получить df с помощью loc:

df.loc['d':'a':-1, 'two':'three']

iloc то же самое что и loc, но вместо имен использует номера позиций

df.iloc[1:3, 0]

DataFrame Functions - Pandas

df.copy()

преобразовать колонку:

df.two.astype(np.int)

transpose

df.T

Очень удобно применять для того чтобы посмотреть на пример данных когда в dataframe очень много столбцов:

df.head(2).T

Посмотреть на данные:

df.head()
df.tail()
df.sample() # какой-то случайный ряд
df.info()
df.describe(include='all')

Настройки отображения:

pd.set_option('display.max_rows', 100)
pd.set_option('precision', 7)

Indexing and Selecting - Pandas

import seaborn as sns
tips = sns.load_dataset('tips')
tips.head(3)

получить df из двух колонок:

tips[['total_bill', 'tip']].head()

получить Series:

tips['total_bill'].head()

Дотавать фрагмент данных с помощью loc или iloc

tips.loc[2:4, 'sex': 'smoker']
tips.iloc[1:3, 0:2]

select using a bool series

tips[tips['tip'] > 1].head()

В некоторых ситуациях можно поулчить multiindex:

mi_tips = tips.groupby(['sex', 'smoker']).agg({'tip': 'mean'})
mi_tips

можно убрать multiindex с помощью:

mi_tips = mi_tips.reset_index()

Индекс уйдет в поле, а дальше можно достать нужные данные привычным способом:

ri_tips[(ri_tips['smoker'] == 'No') & (ri_tips['sex'] == 'Male')]

можно убрать индекс частично:

ri0_tips = mi_tips.reset_index(level=0)

Для получения/изменения одного значения самое правильное использоват at() или iat() — это работает быстрее всего

tips.at[0, 'total_bill'] = 9000
tips.iat[0, 0]

Замер времени можно делать с помощью:

%%timeit
tips.at[0, 'total_bill'] = 6

Автор видео говорит что вполне можно не использовать where, masks & queries, так как это же все можно сделать и другим способом.

Group By - Pandas

This is one the most common things you will do in pandas.

tips_gb = tips.groupby(['sex', 'smoker'])

Это создает объект pandas.core.groupby.generic.DataFrameGroupBy, а над ним уже можно делать что-то интересное.

tips_agg = tips_gb.agg({
    'tip': ['mean', 'min'],
    'day': 'first',
    'total_bill': 'size'
})

tips_agg

Убрать multiindex можно двумя способами, либо с помощью stack, либо

tips_agg.columns = ['__'.join(col).strip() for col in tips_agg.columns.values]
tips_agg.reset_index()

Список агреггирующих функций — https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html#aggregation

  • filter
  • transform

Stack, Unstack, Melt, Pivot - Pandas

Merge, Join, Append, Concat - Pandas

Редактировать страницу на GitHub