In [1]:
import numpy as np
import pandas as pd
from pandas import DataFrame, Series
In [2]:
dframe = DataFrame({'k1':['X','X','Y','Y','Z'],
                    'k2':['alpha','beta','alpha','beta','alpha'],
                    'dataset1':np.random.randn(5),
                    'dataset2':np.random.randn(5)})
dframe
Out[2]:
dataset1 dataset2 k1 k2
0 1.283895 -0.114607 X alpha
1 -0.434267 -1.107295 X beta
2 -0.805005 0.340358 Y alpha
3 -1.102286 -1.005364 Y beta
4 -1.799444 0.076507 Z alpha
In [3]:
# k1をキーとして、データをグループにまとめます。
group1 = dframe['dataset1'].groupby(dframe['k1'])
group1
Out[3]:
<pandas.core.groupby.SeriesGroupBy object at 0x106fad4e0>
In [4]:
#グループごとの平均値を計算
group1.mean()
Out[4]:
k1
X    0.424814
Y   -0.953646
Z   -1.799444
Name: dataset1, dtype: float64
In [5]:
# キーは変えられます。
cities = np.array(['NY','LA','LA','NY','NY'])
month = np.array(['JAN','FEB','JAN','FEB','JAN'])
#  それぞれでグループ化します。
dframe['dataset1'].groupby([cities,month]).mean()
Out[5]:
LA  FEB   -0.434267
    JAN   -0.805005
NY  FEB   -1.102286
    JAN   -0.257774
Name: dataset1, dtype: float64
In [6]:
dframe
Out[6]:
dataset1 dataset2 k1 k2
0 1.283895 -0.114607 X alpha
1 -0.434267 -1.107295 X beta
2 -0.805005 0.340358 Y alpha
3 -1.102286 -1.005364 Y beta
4 -1.799444 0.076507 Z alpha
In [7]:
dframe.groupby('k1').mean()
Out[7]:
dataset1 dataset2
k1
X 0.424814 -0.610951
Y -0.953646 -0.332503
Z -1.799444 0.076507
In [9]:
# 複数の列名にも対応しています。
dframe.groupby(['k1','k2']).mean()
Out[9]:
dataset1 dataset2
k1 k2
X alpha 1.283895 -0.114607
beta -0.434267 -1.107295
Y alpha -0.805005 0.340358
beta -1.102286 -1.005364
Z alpha -1.799444 0.076507
In [25]:
# 列を限定することもできます。
dataset2_group = dframe.groupby(['k1','k2'])[['dataset2']]
dataset2_group.mean()
Out[25]:
dataset2
k1 k2
X alpha -0.114607
beta -1.107295
Y alpha 0.340358
beta -1.005364
Z alpha 0.076507
In [10]:
# size()と一緒に使うのも便利です。
dframe.groupby(['k1']).size()
Out[10]:
k1
X    2
Y    2
Z    1
dtype: int64
In [12]:
# イテレート(繰り返し処理)ができます。
for name,group in dframe.groupby('k1'):
    print('This is the {} group'.format(name))
    print(group)
    print('\n')
This is the X group
   dataset1  dataset2 k1     k2
0  1.283895 -0.114607  X  alpha
1 -0.434267 -1.107295  X   beta


This is the Y group
   dataset1  dataset2 k1     k2
2 -0.805005  0.340358  Y  alpha
3 -1.102286 -1.005364  Y   beta


This is the Z group
   dataset1  dataset2 k1     k2
4 -1.799444  0.076507  Z  alpha


In [13]:
# 複数のキーでも同じ事ができます。
for (k1,k2) , group in dframe.groupby(['k1','k2']):
    print('Key1 = {} Key2 = {}'.format(k1,k2))
    print(group)
    print('\n')
Key1 = X Key2 = alpha
   dataset1  dataset2 k1     k2
0  1.283895 -0.114607  X  alpha


Key1 = X Key2 = beta
   dataset1  dataset2 k1    k2
1 -0.434267 -1.107295  X  beta


Key1 = Y Key2 = alpha
   dataset1  dataset2 k1     k2
2 -0.805005  0.340358  Y  alpha


Key1 = Y Key2 = beta
   dataset1  dataset2 k1    k2
3 -1.102286 -1.005364  Y  beta


Key1 = Z Key2 = alpha
   dataset1  dataset2 k1     k2
4 -1.799444  0.076507  Z  alpha


In [18]:
gr = dframe.groupby('k1')
gr.get_group('X')
Out[18]:
dataset1 dataset2 k1 k2
0 1.283895 -0.114607 X alpha
1 -0.434267 -1.107295 X beta
In [19]:
# リストを作ってそれを辞書にするこもできます。
group_dict = dict(list(dframe.groupby('k1')))
group_dict['X']
Out[19]:
dataset1 dataset2 k1 k2
0 1.283895 -0.114607 X alpha
1 -0.434267 -1.107295 X beta
In [21]:
# 列方向(axis = 1)についても同じような事ができます。
# ちょっと複雑ですが、
group_dict_axis1 = dict(list(dframe.groupby(dframe.dtypes,axis=1)))
group_dict_axis1
Out[21]:
{dtype('float64'):    dataset1  dataset2
 0  1.283895 -0.114607
 1 -0.434267 -1.107295
 2 -0.805005  0.340358
 3 -1.102286 -1.005364
 4 -1.799444  0.076507, dtype('O'):   k1     k2
 0  X  alpha
 1  X   beta
 2  Y  alpha
 3  Y   beta
 4  Z  alpha}