pandasにおけるgroupby()関数の使い方
2500 ワード
pandasのgroupby()関数は非常に一般的な関数であり,パラメータに基づいてDataFrameをグループ化することを意味する.
この関数には、テーブル自体の1つまたは複数の列の内容に基づいてグループ化し、辞書またはSeriesでグループ化する2つの方法があります.
テーブル自体の列または複数の列の内容に基づいてグループ化されます.これはgroupbyの最も一般的な操作で、ある列の内容に基づいて異なる次元に分けて分解し、同じ次元の再集約を1列で集約します.
複数の列で集約すると、複数の列間の次元のデカルト積が見られます.例えばkey 1列でaとbの2つの次元に分けることができ、key 2列でoneとtwoの2つの次元に分けることができ、最後にgroupbyの2列の後の結果は4つのグループです.
辞書やSeriesでグループ化された問題シナリオ:5人の学生がそれぞれ5つのものを評価し、0-5はそのものへの愛の程度を示し、数値が上がるにつれて程度も深まっている.
しかし、この5つの品物は「果物」と「化粧品」の2種類に分けられることが明らかになった.
質問:この5人の同級生の果物と化粧品に対する平均的な愛の程度はどのようなものか知りたいです.
solution 1:辞書によるグループ化
solution 2:Seriesによるグループ化
この関数には、テーブル自体の1つまたは複数の列の内容に基づいてグループ化し、辞書またはSeriesでグループ化する2つの方法があります.
テーブル自体の列または複数の列の内容に基づいてグループ化されます.これはgroupbyの最も一般的な操作で、ある列の内容に基づいて異なる次元に分けて分解し、同じ次元の再集約を1列で集約します.
import pandas as pd
import numpy as np
df = pd.DataFrame({'key1':list('aabba'),
'key2': ['one','two','one','two','one'],
'data1': np.random.randn(5),
'data2': np.random.randn(5)})
for i in df.groupby('key1'):
print(i)
# :
('a', data1 data2 key1 key2
0 -0.293828 0.571930 a one
1 1.872765 1.085445 a two
4 -1.943001 0.106842 a one)
('b', data1 data2 key1 key2
2 -0.466504 1.262140 b one
3 -1.125619 -0.836119 b two)
複数の列で集約すると、複数の列間の次元のデカルト積が見られます.例えばkey 1列でaとbの2つの次元に分けることができ、key 2列でoneとtwoの2つの次元に分けることができ、最後にgroupbyの2列の後の結果は4つのグループです.
for i in df.groupby(['key1','key2']):
print(i)
# :
(('a', 'one'), data1 data2 key1 key2
0 -0.293828 0.571930 a one
4 -1.943001 0.106842 a one)
(('a', 'two'), data1 data2 key1 key2
1 1.872765 1.085445 a two)
(('b', 'one'), data1 data2 key1 key2
2 -0.466504 1.26214 b one)
(('b', 'two'), data1 data2 key1 key2
3 -1.125619 -0.836119 b two)
辞書やSeriesでグループ化された問題シナリオ:5人の学生がそれぞれ5つのものを評価し、0-5はそのものへの愛の程度を示し、数値が上がるにつれて程度も深まっている.
import pandas as pd
import numpy as np
import random
people=pd.DataFrame(
np.random.randint(low=0,high=6,size=(5,5)),
columns=[' ',' ',' ',' ',' '],
index=['Joe','Steve','Wes','Jim','Travis']
)
しかし、この5つの品物は「果物」と「化粧品」の2種類に分けられることが明らかになった.
質問:この5人の同級生の果物と化粧品に対する平均的な愛の程度はどのようなものか知りたいです.
solution 1:辞書によるグループ化
mapping = {' ':' ',' ':' ',' ':' ',' ':' ',' ':' '}
data = people.groupby(mapping,axis=1).mean()
solution 2:Seriesによるグループ化
mapping2 = pd.Series(mapping)
# mapping2
dtype: object
data2 = people.groupby(mapping2,axis=1).mean()