value_count 種類ごとの出現割合

value_counts()では下記のように引数によっていろいろな数え方ができます。

  • 引数normalize=True:出現割合を取得
  • 引数ascending=True:少ない順(昇順)に取得
  • 引数subset=列名や列名のリスト:特定の列の結果だけを取得(DataFrameのみで使用可)。第1引数なので引数名を省略可。

具体例で確認しましょう。

前問と同じく、惣菜店の販売履歴を表した以下のdfを使います。

DateItemNum
02022/04/02弁当A2
12022/04/02中華B3
22022/04/03中華B1
32022/04/03弁当A4
42022/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]:

DateItemNum
02022/04/02弁当A2
12022/04/02中華B3
22022/04/03中華B1
32022/04/03弁当A4
42022/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

コメント

タイトルとURLをコピーしました