この記事ではPandasにおいて値をカウントする方法、欠損ではない値をカウントする方法を紹介します。
この記事の目標
・SeriesとDataFrameで値のカウントの理解
・欠損ではない値をカウントする方法を理解
DataFrameとSeries型の違いがわからない人はまず以下の記事で理解しましょう!!
「DataFrameとSeriesの違いを紹介」
その他Pythonの記事は以下にまとめています!!
「Python記事まとめ」
[スポンサーリンク]
値をカウントする方法
SeriesやDataFrameで値をカウントするには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が返ってきました。
コメント