pandasで同じデータ(要素)がいくつあるか調べる
pandasでDataFrameやSeries内の各データが、データセット内でどの程度の頻度で出現するかを調べます。
目次
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個あることがわかりました。重いものは希少だということがわかります。
更新日 
公開日 
広告
Pythonでデータ分析カテゴリの投稿
- DataFrameの欠損値を特定の値で置き換える
- Pythonでpandas入門1(データの入力とデータへのアクセス)
- Pythonでpandas入門2(データの追加と削除および並び替え)
- Pythonでpandas入門3(データの統計量の計算)
- Pythonでpandas入門4(データの連結と結合)
- Pythonでpandas入門5(欠損値(NaN)の扱い)
- Pythonでデータを学習用と検証用に分割する
- Pythonでデータ分析入門1(初めての回帰分析)
- Pythonでデータ分析入門2(初めてのロジスティック回帰(2クラス分類))
- Pythonでデータ分析入門3(初めての決定木(多クラス分類))
- Pythonで回帰モデルの評価関数
- Pythonで箱ひげ図を描く
- Python(pandas)でExcelファイルを読み込んでDataFrameにする
- pandasでカテゴリ変数を数値データに変換する
- pandasでクロス集計する
- pandasで同じデータ(要素)がいくつあるか調べる
- pandasで相関係数を計算する
- pandasとseabornでデータの可視化(散布図行列)
- pandasの学習用のデータセットを入手する
- scikit-learnのサンプルデータセットを入手する