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と併用することでより複雑な条件設定の元の数え上げが可能となります。

参考