note.nkmk.me

pandasでユニークな要素の個数、頻度(出現回数)をカウント

Date: 2018-01-12 / Modified: 2018-02-13 / tags: Python, pandas
このエントリーをはてなブックマークに追加

pandas.DataFrameの列、pandas.Seriesにおいて、ユニークな要素の個数(重複を除いた件数)、及び、それぞれの要素の頻度(出現回数)を取得する方法を説明する。

pandas.Seriesのメソッドunique(), value_counts()を使う。

例として、以下のデータを使用する。

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

サンプルのcsvファイルはコチラ。

pandas.Series.unique()

unique()は、ユニークな要素の値のリストを返す。list型(Pythonの組み込み型)ではなく一次元のNumPy配列ndarray型。

u = df['state'].unique()
print(u)
print(type(u))
# ['NY' 'CA' 'TX']
# <class 'numpy.ndarray'>

pandas.Series.value_counts()

value_counts()は、ユニークな要素の値がindex、その出現個数がdataとなるpandas.Seriesを返す。要素の頻度(出現回数)が必要な場合はこちらを使う。

vc = df['state'].value_counts()
print(vc)
print(type(vc))
# CA    3
# NY    2
# TX    1
# Name: state, dtype: int64
# <class 'pandas.core.series.Series'>

デフォルトでは出現回数が多い順にソートされるが、引数sort=Falseとすると上から出現した順になる。

vc_f = df['state'].value_counts(sort=False)
print(vc_f)
# TX    1
# CA    3
# NY    2
# Name: state, dtype: int64

ユニークな要素の個数(重複を除いた件数)

unique()で取得したndarray、または、value_counts()で取得したpandas.Seriesの要素数が元のデータのユニークな要素の個数(重複を除いた件数)となる。

len()またはpandas.Seriescount()メソッドを使う。count()NaNではない要素の数を返すメソッド。

print(len(u))
# 3

print(len(vc))
# 3

print(vc.count())
# 3

ユニークな要素の値のリスト

unique()ではNumPy配列ndarray型でユニークな要素の値のリストを取得できる。list型(Pythonの組み込み型)が欲しい場合はtolist()メソッドで変換可能。

print(u.tolist())
print(type(u.tolist()))
# ['NY', 'CA', 'TX']
# <class 'list'>

value_counts()で取得したpandas.Seriesindextolist()メソッドを適用してもOK。valuesでNumPy配列ndarray型として取得することもできる。

print(vc.index.tolist())
print(type(vc.index.tolist()))
# ['CA', 'NY', 'TX']
# <class 'list'>

print(vc.index.values)
print(type(vc.index.values))
# ['CA' 'NY' 'TX']
# <class 'numpy.ndarray'>

ユニークな要素の頻度(出現回数)

ユニークな要素それぞれの頻度(出現回数)を得るには、value_counts()で取得したpandas.Seriesの値にアクセスすればよい。

print(vc['NY'])
# 2

print(vc.NY)
# 2

forループで要素の値と頻度(出現回数)を取り出したい場合はiteritems()メソッドを使う。

for index, value in vc.iteritems():
    print(index, ': ', value)
# CA :  3
# NY :  2
# TX :  1

ユニークな要素とその出現回数の辞書

value_counts()で取得したpandas.Seriesto_dict()メソッドを適用し、辞書化することもできる。

d = vc.to_dict()
print(d)
print(type(d))
# {'CA': 3, 'NY': 2, 'TX': 1}
# <class 'dict'>

print(d['NY'])
# 2

forループで要素の値と頻度(出現回数)を取り出したい場合はitems()メソッドを使う。

for key, value in d.items():
    print(key, ': ', value)
# CA :  3
# NY :  2
# TX :  1

規格化した頻度

value_counts()引数normalizeTrueにすると、合計が1になるように規格化した値が返される。

複数データから頻度分布を比較するときなどに便利。

vc_norm = df['state'].value_counts(normalize=True)
print(vc_norm)
# CA    0.500000
# NY    0.333333
# TX    0.166667
# Name: state, dtype: float64
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事