PandasではSeriesやDataFrameの列データに含まれているデータの個数を調べる関数count
や、各々のデータの値の出現回数(頻度)を求めることができるvalue_counts
関数が存在します。
本記事では、データ全体の個数を数え上げてくれるcount
関数の使い方について解説します。
value_counts
関数の使い方については以下の記事を参照してください。
Pandasでデータの値の出現回数をカウントするvalue_counts関数の使い方 /features/pandas-value-counts.html
頻度からヒストグラムの作成方法を知りたい方は以下の記事を参照してください。
Pandasでヒストグラムの作成や頻度を出力する方法 /features/pandas-hist.html
また、groupby
と併用することでより柔軟な値のカウントを行うことができます。
count関数
count
関数は欠損値以外の値がいくつ含まれているか数えることができる関数です。
APIドキュメント
まずはAPIドキュメントから見ていきましょう。
Series.count
にはlevel
引数のみが含まれています。
pandas.DataFrame.count(axis=0,level=None,numeric_only=False)
params:
パラメータ名 | 型 | 概要 |
---|---|---|
axis | 0,’index’ または 1または’columns’ |
(省略可能)初期値0 0または’index’の時は列ごとのデータの個数を数え上げます。1または’columns’の時は行ごとのデータの個数を数え上げます。 |
level | intもしくは 階層のラベル名 |
(省略可能)初期値None 指定した軸(axis)がMultiIndexだった場合、階層を指定することで、その階層のラベルごとに値の個数をカウントします。 |
numeric_only | bool値 | (省略可能)初期値False 数値データのみを数え上げるかどうかを指定します。 |
returns:
非欠損値の数を含むSeriesまたはDataFrame(levelを指定した場合)が返されます。
引数としては数え上げる方向を選択するaxis
とMultiIndexの時階層名を指定することでそのラベルごとに数え上げることができるlevel
引数、数値データのみを数え上げるように指定できるnumeric_only
があります。
numeric_only
は数値データのみを数え上げたい時にTrue
にします。
列ごとのデータの個数をカウントする
まずはもっとも基本的な使い方である列ごとのデータの個数をカウントする方法です。
In [1]: import pandas as pd
In [3]: df = pd.DataFrame({'A':[0,2,3,1,4],'B':['a','c','e','e','a']})
In [4]: df.count()
Out[4]:
A 5
B 5
dtype: int64
In [5]: df.iloc[3,0] = None # 欠損値を入れる
In [6]: df
Out[6]:
A B
0 0.0 a
1 2.0 c
2 3.0 e
3 NaN e
4 4.0 a
In [7]: df.count() # 欠損値はカウントされない
Out[7]:
A 4
B 5
dtype: int64
行ごとのデータの個数を数える
行ごとにデータの個数を見たい場合は、axis=1
またはaxis='columns'
とすれば数えることができます。
In [8]: df
Out[8]:
A B
0 0.0 a
1 2.0 c
2 3.0 e
3 NaN e
4 4.0 a
In [9]: df.count(axis=1) # 行ごとのデータの個数
Out[9]:
0 2
1 2
2 2
3 1
4 2
dtype: int64
MultiIndexで特定の階層を指定する
MultiIndexで特定の階層のラベルごとに値を数え上げて見ましょう。
In [10]: df_2 = pd.DataFrame([0,1,2,3,4,5,6,7,8,9],
...: index=[['A','A','A','A','A','A','B','B','B','B'],[1,2,3,1,2,3,1,2,3
...: ,1]]) # MultiIndexの作成
...:
In [11]: df_2
Out[11]:
0
A 1 0
2 1
3 2
1 3
2 4
3 5
B 1 6
2 7
3 8
1 9
In [16]: df_2.index.names = ['class','grade'] # 階層にラベルをつける
In [17]: df_2
Out[17]:
0
class grade
A 1 0
2 1
3 2
1 3
2 4
3 5
B 1 6
2 7
3 8
1 9
それではカウントしていきます。
In [18]: df_2.count(level='class') # level=0でも同じ結果が返ってくる
Out[18]:
0
class
A 6
B 4
In [19]: df_2.count(level='grade') # level=1もしくは-1でも同じ結果
Out[19]:
0
grade
1 4
2 3
3 3
数値データのみを数える
数値データのみを数え上げたい時はnumeric_only=True
とします。
こうすると、object型のデータ型だと値を数え上げることはしません。
In [21]: df.count(numeric_only=True)
Out[21]:
A 4
dtype: int64
In [22]: df.loc[3,'B'] = 10
In [23]: df # 文字列データの中に1つだけ数値を入れてみる。
Out[23]:
A B
0 0.0 a
1 2.0 c
2 3.0 e
3 NaN 10
4 4.0 a
In [24]: df.count(numeric_only=True) # 数値データとして認識されないのでカウント対象にならない。
Out[24]:
A 4
dtype: int64
GroupByとcountの併用
groupby
関数とcount
関数を使うことでvalue_counts
関数のような操作を実現することが可能です。
また、グループごとのデータ個数も簡単に取得することが可能です。
In [3]: df = pd.DataFrame({'class':['a','a','a','b','b','c'], 'score':[0,20,10,1
...: ,3,21]})
In [4]: df
Out[4]:
class score
0 a 0
1 a 20
2 a 10
3 b 1
4 b 3
5 c 21
In [5]: df.groupby('class').count()
Out[5]:
score
class
a 3
b 2
c 1
カウント以外の値も取得したい時はgroupby
オブジェクトに対してagg
関数に指定することで実現できます。
In [6]: df.groupby('class').agg(['count','mean']) # 平均とデータ個数
Out[6]:
score
count mean
class
a 3 10
b 2 2
c 1 21
groupby
については以下の記事で詳しい解説をしています。
Pandasのgroupbyを使った要素をグループ化して処理をする方法 /features/pandas-groupby.html
まとめ
今回は、データの個数を数え上げるcount
関数の使い方について解説しました。
基本的にはデータ全体の要素数を数え上げるだけなのですが、groupby
と併用することでより複雑な条件設定の元の数え上げが可能となります。