Упражнения — 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]
В Pandas есть две главные структуры для хранения данных:
В 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]
higly-dimentional data - different columns
Dataframe is a combination of Series.
Состоит из трех вещей:
Будет 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]
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)
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, так как это же все можно сделать и другим способом.
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