import pandas as pd
tree = pd.read_csv("firtree.csv")
Переименуем столбец 'Unnamed: 0'
:
tree.rename(columns = {'Unnamed: 0':'id'},
inplace= True)
Сгруппируем строки в датафрейме по столбцу ftype
:
tree.groupby("ftype")
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x120c01990>
Посмотрим, что внутри объекта типа GroupBy
:
for g in tree.groupby("ftype"):
print(g)
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x116825b10>
Используем перебор по названию группы и датафрейму, соответствующему этой группе и сохраним строки для каждой группы в отдельный файл .csv.
:
for name, dat in tree.groupby("ftype"):
dat.to_csv(name + ".csv")
Применим агрегирование – посчитаем число заполненных ячеек к каждом столбце по каждой группе:
tree.groupby("ftype").agg('count')
id | gender | height | score | expenses | wish | |
---|---|---|---|---|---|---|
ftype | ||||||
ель обыкновенная | 258 | 258 | 258 | 258 | 258 | 257 |
пихта Нобилис | 326 | 326 | 326 | 326 | 326 | 325 |
сосна Крым | 327 | 327 | 327 | 327 | 327 | 327 |
сосна датская | 289 | 289 | 289 | 289 | 289 | 289 |
А теперь ещё и среднее:
tree.groupby("ftype").agg(['count', 'mean'])
id | height | score | expenses | |||||
---|---|---|---|---|---|---|---|---|
count | mean | count | mean | count | mean | count | mean | |
ftype | ||||||||
ель обыкновенная | 258 | 575.895349 | 258 | 155.503876 | 258 | 2.980620 | 258 | 1603.813953 |
пихта Нобилис | 326 | 623.076687 | 326 | 160.101227 | 326 | 3.082822 | 326 | 1634.463190 |
сосна Крым | 327 | 596.599388 | 327 | 160.657492 | 327 | 2.987768 | 327 | 1572.076453 |
сосна датская | 289 | 601.411765 | 289 | 159.280277 | 289 | 2.958478 | 289 | 1709.916955 |
И медиану заодно:
tree.groupby("ftype").agg(['count', 'mean', 'median'])
id | height | score | expenses | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
count | mean | median | count | mean | median | count | mean | median | count | mean | median | |
ftype | ||||||||||||
ель обыкновенная | 258 | 575.895349 | 570.5 | 258 | 155.503876 | 149.0 | 258 | 2.980620 | 3 | 258 | 1603.813953 | 1580 |
пихта Нобилис | 326 | 623.076687 | 639.5 | 326 | 160.101227 | 159.5 | 326 | 3.082822 | 3 | 326 | 1634.463190 | 1634 |
сосна Крым | 327 | 596.599388 | 614.0 | 327 | 160.657492 | 157.0 | 327 | 2.987768 | 3 | 327 | 1572.076453 | 1552 |
сосна датская | 289 | 601.411765 | 557.0 | 289 | 159.280277 | 159.0 | 289 | 2.958478 | 3 | 289 | 1709.916955 | 1795 |
Теперь сообщим pandas, какую именно характеристику для какого именно столбца считать:
res = tree.groupby("ftype").agg({'id' : ['count'],
'height' : ['mean'],
'score' : ['median']})
res
id | height | score | |
---|---|---|---|
count | mean | median | |
ftype | |||
ель обыкновенная | 258 | 155.503876 | 3 |
пихта Нобилис | 326 | 160.101227 | 3 |
сосна Крым | 327 | 160.657492 | 3 |
сосна датская | 289 | 159.280277 | 3 |
Сохранили результат в переменную res
. Посмотрим на её структуру: выведем названия столбцов и строк:
res.columns
MultiIndex([( 'id', 'count'), ('height', 'mean'), ( 'score', 'median')], )
res.index
Index(['ель обыкновенная', 'пихта Нобилис', 'сосна Крым', 'сосна датская'], dtype='object', name='ftype')
res["height"]
mean | |
---|---|
ftype | |
ель обыкновенная | 155.503876 |
пихта Нобилис | 160.101227 |
сосна Крым | 160.657492 |
сосна датская | 159.280277 |
res["height"]["mean"]
ftype ель обыкновенная 155.503876 пихта Нобилис 160.101227 сосна Крым 160.657492 сосна датская 159.280277 Name: mean, dtype: float64
res.loc['ель обыкновенная', :]
id count 258.000000 height mean 155.503876 score median 3.000000 Name: ель обыкновенная, dtype: float64
res2 = tree.groupby(["gender", "wish"]).agg({'expenses':
['count', 'mean', 'median']})
res2
expenses | ||||
---|---|---|---|---|
count | mean | median | ||
gender | wish | |||
female | да | 307 | 1710.781759 | 1754 |
нет | 304 | 1567.052632 | 1519 | |
male | да | 304 | 1659.345395 | 1680 |
нет | 283 | 1571.915194 | 1512 |
res2.columns
MultiIndex([('expenses', 'count'), ('expenses', 'mean'), ('expenses', 'median')], )
res2.index
MultiIndex([('female', 'да'), ('female', 'нет'), ( 'male', 'да'), ( 'male', 'нет')], names=['gender', 'wish'])
res2.xs('да', level = 'wish')
expenses | |||
---|---|---|---|
count | mean | median | |
gender | |||
female | 307 | 1710.781759 | 1754 |
male | 304 | 1659.345395 | 1680 |
res2.xs('female', level = 'gender')
expenses | |||
---|---|---|---|
count | mean | median | |
wish | |||
да | 307 | 1710.781759 | 1754 |
нет | 304 | 1567.052632 | 1519 |
res2.xs('female', level = 'gender')['expenses'].iloc[0,0]
307
res2.xs('female', level = 'gender')['expenses'].loc["да", 'count']
307