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のサンプルデータセットを入手する