【Python】Pandasで値のカウント、欠損ではない数をカウントする方法を紹介

【Python】Pandasで値のカウント、欠損ではない数をカウントする方法を紹介

この記事ではPandasにおいて値をカウントする方法、欠損ではない値をカウントする方法を紹介します。

この記事の目標
・SeriesとDataFrameで値のカウントの理解
・欠損ではない値をカウントする方法を理解

 

DataFrameとSeries型の違いがわからない人はまず以下の記事で理解しましょう!!
DataFrameとSeriesの違いを紹介
その他Pythonの記事は以下にまとめています!!

Python記事まとめ

 

[スポンサーリンク]


値をカウントする方法

SeriesDataFrameで値をカウントするにはvalue_countsメソッドを使用します。
記載方法は以下の通りで基本的にはSeries型を指定して使用します。
とはいえもちろんDataFrameで一気にカウントする方法もあるので後程紹介!

Series型.value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True)
引数 初期値 説明
sort True ソートするか否かを指定
ascending False 昇順で並び変えるか否かを指定
normalize False 相対的な出現頻度にするか否かを指定
bins None 指定すると一定範囲毎にカウントする。指定する数値は区切る数。
dropna True 欠損値をカウントするか否かを指定

色々引数があるんですけど、ただ値をカウントしたいという場合は何も指定しなくてOKです!
そうではなく、色々いじりたい人は引数も是非参考にしてください。

 

確認するにあたり以下のAが2個、Bが3個、Cが1個あるSeriesを使用します。

import pandas as pd
sr=pd.Series(["A","A","B","C","B"])
print(sr)

#print表示
#0 A
#1 A
#2 B
#3 C
#4 B
#dtype: object

 

引数無し

まずはシンプルに引数無しで行います。
引数無しだと各値のカウント結果をソートして返してくれます。

カウント対象

print(sr)
#print表示
#0 A
#1 A
#2 B
#3 C
#4 B
#dtype: object

カウント実行

print(sr.value_counts())
#print表示
#B 3
#A 2
#C 1
#dtype: int64

正しく、Bが3個、Aが2個、Cが1個とカウントして返してくれました。

 

sortオプションの使用

sortオプションソートするか否かを指定するオプションです。
Trueでソート、Falseでソートしません。
(デフォルトはTrue)

デフォルトでTrueになっているので特に指定しなくてもソートしてくれます。
そのためソートしたい場合は特に意識する必要がありません。

print(sr.value_counts())
#print表示
#B 3
#A 2
#C 1
#dtype: int64

逆にソートしないでほしいという時だけFalseを指定してあげましょう。

print(sr.value_counts(sort=False))
#print表示
#A 2
#B 3
#C 1
#dtype: int64

Falseを指定することでソートが解除されました。

 

ascendingオプションの使用

ascendingオプションはソートを昇順にするか降順にするか指定するオプションです。
Trueで昇順、Falseで降順になります。
(デフォルトはFalse)

デフォルトでは降順となっているので、昇順にしたいという時だけ指定しましょう。

print(sr.value_counts(ascending=True))
#print表示
#C 1
#A 2
#B 3
#dtype: int64

Trueに指定することで昇順で結果が返ってきました。

 

normalizeオプションの使用

normalizeオプションは結果を出現頻度で返すオプションです。
Trueで出現頻度で返すようになります。(デフォルトはFalse)
カウント結果ではなく、出現頻度を返してほしいという時にTrueで指定しましょう。

指定しない場合の結果

print(sr.value_counts())
#print表示
#B 3
#A 2
#C 1
#dtype: int64

出現頻度に変更した結果

print(sr.value_counts(normalize=True))
#print表示
#B 0.500000
#A 0.333333
#C 0.166667
#dtype: float64

確かに指定することで出現頻度に変化しました。

 

binsオプションの使用

binsオプションは指定範囲内の数をカウントして返すオプションです。
使用する時はbinsで区間をいくつ区切るのかを指定します。

確認のために以下の1~100までの連続した数値を持つSeries型を使用します。

df_r=pd.Series([a for a in range(1,101)])
print(df_r)
"""
#print表示
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
  …
90 91
91 92
92 93
93 94
94 95
95 96
96 97
97 98
98 99
99 100
Length: 100, dtype: int64
"""

では試しにbinsを5で実行してみましょう。
今回は1~100なので値の範囲が20ずつで区切られて、結果も20ずつになるはずです。

print(df_r.value_counts(bins=5))
"""
#print表示
(80.2, 100.0] 20
(60.4, 80.2] 20
(40.6, 60.4] 20
(20.8, 40.6] 20
(0.9, 20.8] 20
dtype: int64
"""

結果は予想通り20ずつになりました。
均等になるように5区間に分けられてそれぞれカウントしていることがわかります。

 

dropnaオプションの使用

dropnaオプション欠損値Nanをカウントするか否かを指定するオプションです。
Trueでカウントしない、Falseでカウントします。
(デフォルトはTrue)

では確認のために以下の欠損値Nanが存在するSeriesを使用します。

import numpy as np
import pandas as pd
sr=pd.Series(["A","A","B","B","B",np.nan])
print(sr)
"""
#print表示
0 A
1 A
2 B
3 B
4 B
5 NaN
dtype: object
"""

何も指定しない場合はdropnaオプションがTrueなので欠損値Nanのカウントがされません。

print(sr.value_counts())
#print表示
#B 3
#A 2
#dtype: int64

しかしdropnaオプションをFalseにすると以下のように欠損値Nanの数もカウントして返してくれるようになります。

print(sr.value_counts(dropna=False))
#print表示
#B 3
#A 2
#NaN 1
#dtype: int64

[スポンサーリンク]


DataFrameでカウントする

これまでSeriesの場合のみを見ていきましたが、DataFrameで一気に実行したい場合を紹介します。
確認のために以下のDataFrameを使用します。

import pandas as pd
df=pd.DataFrame([["A","A","E"],["B","B","B"],["B","D","E"],["A","D","D"]])
print(df)
"""
#print表示
  0 1 2
0 A A E
1 B B B
2 B D E
3 A D D
"""

value_countsメソッドSeriesに適用できるのでDataFrameの各列毎に実行すればなんとかできますが、まぁめんどうです。

そこでapplyメソッドを使用します。
applyメソッドSeriesにのみ使用できるメソッドをDataFrameでも適用できるようにしたい時使用します。
まさに今回は適任なわけです。

指定方法は以下の通り

指定のdf.apply(pd.value_counts)

では実際に使用して確認してみましょう。

print(df.apply(pd.value_counts))
"""
#print表示
    0 1 2
A 2.0 1.0 NaN
B 2.0 1.0 1.0
D NaN 2.0 1.0
E NaN NaN 2.0
"""

実行すると0列、1列、2列のそれぞれにおいてA、B、D、Eがいくつ出現したのかを出力してくれました。
0列目においてAは2個、Bが2個、DEは無し
1列目においてAは1個、Bが1個、Dが2個、Eは無し
2列目においてAは無し、Bが1個、Dが1個、Eが2個と正しい結果です。

 

カウントする値が存在しない場合は欠損値Nanとなりますが、
欠損値Nanを指定の値で穴埋めしたい場合はfillnaメソッドを使用します。

では試しに0で穴埋めしてみましょう。

print(df.apply(pd.value_counts).fillna(0))
"""
#print表示
    0 1 2
A 2.0 1.0 0.0
B 2.0 1.0 1.0
D 0.0 2.0 1.0
E 0.0 0.0 2.0
"""

さきほどは欠損値Nanだった所が0になりました。

 

欠損ではない値のカウント

次に欠損値以外の数値の数をカウントする場合の紹介です。
欠損値以外の値の数をカウントする時はcountメソッドを使用します。

指定方法は以下の通りシンプル

Series型.count()

確認するにあたり欠損ではない値が4個存在するSeriesを使用します。

import pandas as pd
import numpy as np
sr_t=pd.Series(["A","B","C","D",np.nan,np.nan])
print(sr_t)
"""
#print表示
0 A
1 B
2 C
3 D
4 NaN
5 NaN
dtype: object
"""

実際にカウントを実行します。

print(sr_t.count())
#print表示
#4

正しく4が返ってきました。

Pandasカテゴリの最新記事