Pynote

Python、機械学習、画像処理について

pandas - 重複データを処理する関数 まとめ

一覧

DataFrame Series 説明
Series.is_unique 重複する値がないかどうか
Series.unique 重複する値を削除する。
DataFrame.drop_duplicates Series.drop_duplicates 重複する値を削除する。
DataFrame.nunique Series.nunique 重複する値を除いた要素数を返す。
DataFrame.duplicated Series.duplicated 重複しているかどうかを返す。
Series.factorize 値に整数を割り当てる。
Series.value_counts 各値の出現回数を数える。

Series.is_unique: 重複する値がないかどうかを返す。

Series.is_unique は Series に重複する値ある場合は True、ない場合は False になる。

import pandas as pd

# 重複する値がある場合
s = pd.Series(['b', 'b', 'a', 'c', 'b'])
print(s.is_unique)  # False

# 重複する値がない場合
s = pd.Series(['a', 'b', 'c', 'd', 'e'])
print(s.is_unique)  # True

Series.unique, Series.drop_duplicates, DataFrame.drop_duplicates: 重複する値を削除する。

Series.unique、Series.drop_duplicates はどちらも重複する値を除いたコピーを返すが、
Series.unique は numpy 配列、Series.drop_duplicates は Series を返すという違いがある。

import pandas as pd

s = pd.Series(['b', 'b', 'a', 'c', 'b'])

s2 = s.unique()
print(s2)  # ['b' 'a' 'c']
print(type(s2))  # <class 'numpy.ndarray'>
import pandas as pd

s = pd.Series(['b', 'b', 'a', 'c', 'b'])

s2 = s.drop_duplicates()
print(s2)
# 0    b
# 2    a
# 3    c
# dtype: object

inplace=True で inplace に処理が行える。

import pandas as pd

s = pd.Series(['b', 'b', 'a', 'c', 'b'])

s.drop_duplicates(inplace=True)
print(s)
# 0    b
# 2    a
# 3    c
# dtype: object

Series.nunique, DataFrame.nunique: 重複する値を除いた要素数を返す。

import pandas as pd

s = pd.Series(['b', 'b', 'a', 'c', 'b'])

print(s.nunique())  # 3

Series.duplicated, DataFrame.duplicated: 重複しているかどうかを返す。

重複しているかどうかをブール配列で返す。

import pandas as pd

s = pd.Series(['b', 'b', 'a', 'c', 'b'])

print(s.duplicated())
# 0    False
# 1     True
# 2    False
# 3    False
# 4     True
# dtype: bool

Series.factorize: 値に整数を割り当てる。

Series.factorize で値に整数を割り当てられる。
割り当てられる整数は0, 1, 2, ... という連番になっている。
返り値は uniques はラベル一覧を表す1次元配列、labels は uniques の該当するインデックスの一覧を表す。

labels, uniques = pd.factorize(['b', 'b', 'a', 'c', 'b'])
print(labels)  # [0 0 1 2 0]
print(uniques)  # ['b' 'a' 'c']

na_sentinel で欠損値に割り当てる整数を指定できる。デフォルトは -1 となっている。

labels, uniques = pd.factorize(['b', 'b', 'a', 'c', None])
print(labels)  # [ 0  0  1  2 -1]
print(uniques)  # ['b' 'a' 'c']

labels, uniques = pd.factorize(['b', 'b', 'a', 'c', None], na_sentinel=-100)
print(labels)  # [   0    0    1    2 -100]
print(uniques)  # ['b' 'a' 'c']

sort=True の場合、返り値 uniques はソートされる。

import pandas as pd

s = pd.Series(['b', 'b', 'a', 'c', 'b'])

labels, uniques = pd.factorize(s, sort=False)
print(uniques)  # Index(['b', 'a', 'c'], dtype='object')

labels, uniques = pd.factorize(s, sort=True)
print(uniques)  # Index(['a', 'b', 'c'], dtype='object')

Series.value_counts: 各値の出現回数を数える。

import pandas as pd

s = pd.Series(['b', 'b', 'a', 'c', 'b'])

print(s.value_counts())
# b    3
# a    1
# c    1
# dtype: int64