pandasで同じデータ(要素)がいくつあるか調べる

pandasでDataFrameやSeries内の各データが、データセット内でどの程度の頻度で出現するかを調べます。

目次

  1. value_countsメソッドで集計する
  2. 実施例

value_countsメソッドで集計する

import pandas as pd

ret = df.value_counts([subset], [normalize], [sort], [ascending], [dropna])
ret = s.value_counts([normalize], [sort], [ascending], [bins], [dropna])

DataFrameの場合とSeriesの場合で、異なる引数があります。

変数

内容

df

DataFrame

集計の対象となるDataFrame。

s

Series

集計の対象となるSeries。

subset

list

省略可。規定値はNone。集計する対象の列名を指定する。

normalize

bool

省略可。規定値はFalse。出現数を正規化するかどうか。

sort

bool

省略可。規定値はTrue。結果を頻度順に並び替えるか。

ascending

bool

省略可。規定値はFalse。結果を昇順で並び替えるか。

dropna

bool

省略可。規定値はTrue。欠損値を含めないかどうか。

bins

int

省略可。既定値はNone。数値データを指定した数に分割して集計する。

ret

Series

ユニークな要素とその出現頻度を表すSeries。

実施例

では、実際に集計してみましょう。

データセットとしてseabornのdiamondsデータセットを使用します。

diamondsデータセットは、carat、cut、color、clarity、depth、table、x、y、zといった特徴量からpriceを予測するというものです。

まずデータセットをダウンロードして、データの各列の型を確認してみましょう。

import pandas as pd
import seaborn as sns

data = sns.load_dataset('diamonds')

print(data.info())
print(data.head())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 53940 entries, 0 to 53939
Data columns (total 10 columns):
 #   Column   Non-Null Count  Dtype
---  ------   --------------  -----
 0   carat    53940 non-null  float64
 1   cut      53940 non-null  category
 2   color    53940 non-null  category
 3   clarity  53940 non-null  category
 4   depth    53940 non-null  float64
 5   table    53940 non-null  float64
 6   price    53940 non-null  int64
 7   x        53940 non-null  float64
 8   y        53940 non-null  float64
 9   z        53940 non-null  float64
dtypes: category(3), float64(6), int64(1)
memory usage: 3.0 MB

None
   carat      cut color clarity  depth  table  price     x     y     z
0   0.23    Ideal     E     SI2   61.5   55.0    326  3.95  3.98  2.43
1   0.21  Premium     E     SI1   59.8   61.0    326  3.89  3.84  2.31
2   0.23     Good     E     VS1   56.9   65.0    327  4.05  4.07  2.31
3   0.29  Premium     I     VS2   62.4   58.0    334  4.20  4.23  2.63
4   0.31     Good     J     SI2   63.3   58.0    335  4.34  4.35  2.75

cut、color、clarityが文字データ、他は数値データということがわかりました。

各クラスの出現数

cutの各クラス(IdealやPremiumなど)の出現数を集計します。

import pandas as pd
import seaborn as sns

data = sns.load_dataset('diamonds')

print(data['cut'].value_counts())
print(data.value_counts(subset=['cut']))
Ideal        21551
Premium      13791
Very Good    12082
Good          4906
Fair          1610
Name: cut, dtype: int64

cut
Ideal        21551
Premium      13791
Very Good    12082
Good          4906
Fair          1610
dtype: int64

最初に出力したものは、DataFrameからcutの列をSeriesとして切り出してからvalue_counts()で集計したものです。2つめに出力したものは、value_counts()のsubset引数にcut列を指定してDataFrameを直接集計したものです。

DataFrameを対象とする場合は、複数の列を使って集計することができます。

cutとcolorを使って集計してみます。(結果が見やすくなるようsortにFalseを指定してあります。)

import pandas as pd
import seaborn as sns

data = sns.load_dataset('diamonds')

print(data.value_counts(subset=['cut','color'],sort=False))
cut        color
Ideal      D        2834
           E        3903
           F        3826
           G        4884
           H        3115
           I        2093
           J         896
Premium    D        1603
           E        2337
           F        2331
           G        2924
           H        2360
           I        1428
           J         808
Very Good  D        1513
           E        2400
           F        2164
           G        2299
           H        1824
           I        1204
           J         678
Good       D         662
           E         933
           F         909
           G         871
           H         702
           I         522
           J         307
Fair       D         163
           E         224
           F         312
           G         314
           H         303
           I         175
           J         119
dtype: int64

cutとcolorの各組み合わせについて、出現数が集計されました。

頻度を正規化する

cut列の各クラスの出現頻度を正規化します。

import pandas as pd
import seaborn as sns

data = sns.load_dataset('diamonds')

print(data['cut'].value_counts(normalize=True))
Ideal        0.399537
Premium      0.255673
Very Good    0.223990
Good         0.090953
Fair         0.029848
Name: cut, dtype: float64

どのくらいの割合で出現するのか分かり易いですね。

結果を並び替える

既定値で集計すると、頻度が降順で並び変わって出力されます。

昇順で表示してみましょう。

import pandas as pd
import seaborn as sns

data = sns.load_dataset('diamonds')

print(data['cut'].value_counts(ascending=True))
Fair          1610
Good          4906
Very Good    12082
Premium      13791
Ideal        21551
Name: cut, dtype: int64

数値データを分割して集計する

caratのデータは、最小値が0.2で最大値が5.01です。これを、4種類に分類して頻度を集計してみます。

import pandas as pd
import seaborn as sns

data = sns.load_dataset('diamonds')

print(data['carat'].value_counts(bins=4))
(0.194, 1.402]    47531
(1.402, 2.605]     6342
(2.605, 3.808]       61
(3.808, 5.01]         6
Name: carat, dtype: int64

0.194~1.402に含まれるものが47,531個、1.402~2.065に含まれるものが6,342個、2.605~3.808に含まれるものが61個、3.808~5.01に含まれるものが6個あることがわかりました。重いものは希少だということがわかります。

更新日
公開日

広告