value_counts()
では下記のように引数によっていろいろな数え方ができます。
- 引数
normalize=True
:出現割合を取得 - 引数
ascending=True
:少ない順(昇順)に取得 - 引数
subset=列名や列名のリスト
:特定の列の結果だけを取得(DataFrameのみで使用可)。第1引数なので引数名を省略可。
具体例で確認しましょう。
前問と同じく、惣菜店の販売履歴を表した以下のdf
を使います。
Date | Item | Num | |
---|---|---|---|
0 | 2022/04/02 | 弁当A | 2 |
1 | 2022/04/02 | 中華B | 3 |
2 | 2022/04/03 | 中華B | 1 |
3 | 2022/04/03 | 弁当A | 4 |
4 | 2022/04/03 | サラダ | 2 |
出現割合(normalize=True)
出現割合は、SeriesやDataFrameのvalue_counts()
で、normalize=True
を指定することで取得できます。
# Seriesの場合
df.列名.value_counts(normalize=True)
# DataFrameの場合
df.value_counts(normalize=True)
normalize
は正規化を意味します。ここでは「合計を1にする」処理をします。合計が1なので、各値は割合になります。
たとえば、列Item
の出現割合は、以下のようになります。
df.Item.value_counts(normalize=True)
実行結果
弁当A 0.4
中華B 0.4
サラダ 0.2
Name: Item, dtype: float64
実行結果を確認すると、弁当A
は5件のデータ中2件なので結果が0.4
となり、割合が計算できていることがわかります。
少ない順(ascending=True)
value_counts()
は、デフォルトでは出現回数の多い順になります。
少ない順にしたい場合は、ascending=True
を指定します。
たとえば、列Item
の少ない順の出現割合は、以下のようになります。
df.Item.value_counts(normalize=True, ascending=True)
実行結果
サラダ 0.2
弁当A 0.4
中華B 0.4
Name: Item, dtype: float64
実行結果を確認すると、割合の一番少ないサラダ
が先頭になっています。
対象列指定(subset)
DataFrame.value_counts()
の第1引数subset
では、対象とする列名や列名のリストを指定できます。
列名のリストは、一部の列の組み合わせの出現回数や出現割合を取得したい場合に使えます。
たとえば、列Date
と列Item
を対象とする場合は、以下のようになります。ここでは引数名subset
は省略しています。
df.value_counts(["Date", "Item"])
実行結果
Date Item
2022/04/02 中華B 1
弁当A 1
2022/04/03 サラダ 1
中華B 1
弁当A 1
dtype: int64
実行結果は「列の要素の組み合わせ」ごとの出現回数です。
演習
惣菜店の販売履歴のDataFrameを作成します。
import pandas as pd df = pd.DataFrame({ "Date": ["2022/04/02", "2022/04/02", "2022/04/03", "2022/04/03", "2022/04/03"], "Item": ["弁当A", "中華B", "中華B", "弁当A", "サラダ"], "Num": [2, 3, 1, 4, 2], }) df
Out[1]:
Date | Item | Num | |
---|---|---|---|
0 | 2022/04/02 | 弁当A | 2 |
1 | 2022/04/02 | 中華B | 3 |
2 | 2022/04/03 | 中華B | 1 |
3 | 2022/04/03 | 弁当A | 4 |
4 | 2022/04/03 | サラダ | 2 |
種類ごとの出現割合は、列に対してvalue_counts(normalize=True)
で取得できます。 全5行のうち、2022/04/02が2行なので0.4、2022/04/03が3行なので0.6です。出現回数の多い順になります。In [2]:
df.Date.value_counts(normalize=True)
2022/04/03 0.6 2022/04/02 0.4 Name: Date, dtype: float64
続いて、列Item
の種類ごとの出現割合を確認してみましょう。In [3]:
df.Item.value_counts(normalize=True)
Out[3]:
弁当A 0.4 中華B 0.4 サラダ 0.2 Name: Item, dtype: float64
次に、列Item
の出現割合を少ない順に取得します。少ない順にするには、ascending=True
をつけます。サラダが0.2なので最初になります。In [4]:
df.Item.value_counts(normalize=True, ascending=True)
Out[4]:
サラダ 0.2 弁当A 0.4 中華B 0.4 Name: Item, dtype: float64
DataFrameの一部の列について確認してみましょう。ここでは列Item
を指定します。In [5]:
df.value_counts("Item", normalize=True, ascending=True)
Out[5]:
Item サラダ 0.2 中華B 0.4 弁当A 0.4 dtype: float64
最後に、列Date
と列Item
の要素の組み合わせについて、出現回数を確認してみましょう。 「複数列の要素の組み合わせ」について出現回数を取得する場合は、列名のリストを指定します。ここでは列Date
と列Item
を指定します。In [6]:
df.value_counts(["Date", "Item"])
Out[6]:
Date Item 2022/04/02 中華B 1 弁当A 1 2022/04/03 サラダ 1 中華B 1 弁当A 1 dtype: int64
コメント