Pandasが得意としているのは、ある条件でデータを分類し、その特徴を調べるという処理です。具体的には、
という流れとなります。
どういうgroupに分けるか、分けたDataFrameでどのような計算を行うかは解析の最も難しく面白いところだと思います。
このあたりの手法はGroup By: split-apply-combineを参考にしました。
引数で与えた列をkeyとして、分割してDataFrameGroupByオブジェクトを返す関数です(分割)。
import pandas as pd
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame({
"alphabet": np.random.choice(list("abc"), 15),
"randn": np.random.randn(15),
"rand": np.random.rand(15),
})
df
イテレータであり、for ~ in ...の...に置くと、グループ名と分割されたDataFrameを取り出すことが出来ます。
for _name, _df in df.groupby("alphabet"):
print(_name)
print(_df)
print()
# get_groupで特定のkeyを持つDataFrameを取得する
df.groupby("alphabet").get_group("a")
DataFrameGroupByオブジェクトのメソッドを呼び出すことで、分割された各DataFrameで計算されます(適用)。
最終的に、グループごとに計算を行った結果がまとめられます(結合)。
# GroupByオブジェクトの関数を呼ぶとグループごとに計算した結果を返す
df.groupby("alphabet").mean()
自作関数を各列に適用するためにはaggメソッドを使います。
# 最大値と最小値の差を計算する自作関数
def func(cols):
return cols.max() - cols.min()
# aggメソッドで各グループ、各列に関数を適用し、値を得る
df.groupby("alphabet").agg(func).plot.bar()
正規分布乱数の方が最大値と最小値の差が大きいことがわかりますね。