Pandas pd.unique() 関数
pd.unique()Pandasライブラリにおいて、配列内の一意の値を取得するための関数です。入力配列内のすべての重複しない値を返し、重複項目を除去します。
これはデータ分析における一般的な操作で、例えば、1つの列にいくつの異なる値があるかを数えたり、特定のカテゴリ変数のすべてのカテゴリを取得したりします。
単語の意味: unique「唯一の、独特な」という意味で、ここでは配列内で重複しない値を返すことを指します。
基本構文とパラメータ
pd.unique()Pandasライブラリのトップレベル関数であり、配列内の一意の値を抽出するために使用されます。
構文形式
pd.unique(values)
パラメータの説明
- パラメータ:
values- 型: 配列類似オブジェクト(リスト、Series、一次元配列など)。
- 説明: 一意の値を抽出する入力データ。任意の一次元の配列構造にすることができます。
関数の説明
- 戻り値: すべての一意の値を含む ndarray(NumPy配列)を返します。
- 効果: 入力データから重複する値を取り除き、各値が1回だけ出現するようにします。
実例
簡単なものから複雑なものまでの一連の例を通して、pd.unique()その使い方を徹底的にマスターしましょう。
例1:基本用法 - Seriesから一意の値を抽出する
実例
import pandas as pd
import numpy as np
# 1. 重複する値を含むSeriesを作成
colors = pd.Series(['red', 'blue', 'green', 'red', 'blue', 'yellow', 'red'])
print("=== 元の Series ===")
print(colors)
# 2. pd.unique() を使用して一意の値を取得
unique_values = pd.unique(colors)
print("\n=== pd.unique() 一意の値 ===")
print(unique_values)
print(f"\n一意の値の数: {len(unique_values)}")
import numpy as np
# 1. 重複する値を含むSeriesを作成
colors = pd.Series(['red', 'blue', 'green', 'red', 'blue', 'yellow', 'red'])
print("=== 元の Series ===")
print(colors)
# 2. pd.unique() を使用して一意の値を取得
unique_values = pd.unique(colors)
print("\n=== pd.unique() 一意の値 ===")
print(unique_values)
print(f"\n一意の値の数: {len(unique_values)}")
実行結果の想定:
=== 原始 Series === 0 red 1 blue 2 green 3 red 4 blue 5 yellow 6 red dtype: object === pd.unique() 唯一值 === ['red' 'blue' 'green' 'yellow'] 唯一值数量: 4
コードの解説:
- 元のSeriesには7つの要素がありますが、一意の値は4つだけです。
pd.unique()すべての重複しない値を含むNumPy配列を返します。- 返される結果は順序を保証しません(ただし通常は最初に出現した順序です)。
例2:リストと配列から一意の値を抽出する
pd.unique()Seriesだけでなく、さまざまな配列構造も処理できます。
実例
import pandas as pd
import numpy as np
# 1. リストから一意の値を抽出
numbers = [1, 2, 3, 2, 1, 4, 5, 3, 2]
print("=== 元のリスト ===")
print(numbers)
unique_numbers = pd.unique(numbers)
print("\n=== リストの一意の値 ===")
print(unique_numbers)
print(f"型: {type(unique_numbers)}")
# 2. NumPy配列から一意の値を抽出
arr = np.array(['a', 'b', 'a', 'c', 'b', 'd'])
print("\n=== NumPy 配列 ===")
print(arr)
print("一意の値:", pd.unique(arr))
# 3. DataFrameの列から抽出
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Diana'],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Beijing', 'Guangzhou']
})
print("\n=== DataFrame ===")
print(df)
print("\nname 列の一意の値:", pd.unique(df['name']))
print("city 列の一意の値:", pd.unique(df['city']))
import numpy as np
# 1. リストから一意の値を抽出
numbers = [1, 2, 3, 2, 1, 4, 5, 3, 2]
print("=== 元のリスト ===")
print(numbers)
unique_numbers = pd.unique(numbers)
print("\n=== リストの一意の値 ===")
print(unique_numbers)
print(f"型: {type(unique_numbers)}")
# 2. NumPy配列から一意の値を抽出
arr = np.array(['a', 'b', 'a', 'c', 'b', 'd'])
print("\n=== NumPy 配列 ===")
print(arr)
print("一意の値:", pd.unique(arr))
# 3. DataFrameの列から抽出
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Diana'],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Beijing', 'Guangzhou']
})
print("\n=== DataFrame ===")
print(df)
print("\nname 列の一意の値:", pd.unique(df['name']))
print("city 列の一意の値:", pd.unique(df['city']))
実行結果の想定:
=== 原始列表 ===
[1, 2, 3, 2, 1, 4, 5, 3, 2]
=== 列表的唯一值 ===
[1 2 3 4 5]
タイプ: <class 'numpy.ndarray'>
=== NumPy 数组 ===
['a' 'b' 'a' 'c' 'b' 'd']
唯一值: ['a' 'b' 'c' 'd']
=== DataFrame ===
name city
0 Alice Beijing
1 Bob Shanghai
2 Charlie Beijing
3 Alice Beijing
4 Diana Guangzhong
=== name 列的唯一值: ['Alice' 'Bob' 'Charlie' 'Diana']
=== city 列的唯一值: ['Beijing' 'Shanghai' 'Guangzhou']
コードの解説:
pd.unique()Pythonリスト、NumPy配列、およびDataFrameの列を処理できます。- 返される結果は常に一次元のNumPy配列です。
- DataFrameを処理する際は、具体的な列を指定する必要があります(角括弧構文を使用)。
例3:数値データの処理とソート
数値型の一意の値を処理する際、ソートや統計分析を簡単に行えます。
実例
import pandas as pd
import numpy as np
# 1. 重複する数値を含むSeries
scores = pd.Series([85, 90, 78, 85, 92, 90, 78, 88, 95])
print("=== 元のスコア ===")
print(scores)
# 2. 一意の値を取得してソート
unique_scores = pd.unique(scores)
print("\n=== 一意の値(未ソート)===")
print(unique_scores)
# 3. ソート後の一意の値
unique_sorted = np.unique(unique_scores)
print("\n=== 一意の値(ソート後)===")
print(unique_sorted)
# 4. 各一意の値の出現回数を集計
print("\n=== 一意の値と頻度 ===")
value_counts = pd.Series(scores).value_counts()
print(value_counts)
# 5. 一意の値に対応する統計情報を取得
print("\n=== 基本統計 ===")
print(f"一意の値の数: {len(unique_scores)}")
print(f"最小値: {unique_scores.min()}")
print(f"最大値: {unique_scores.max()}")
print(f"平均値: {unique_scores.mean():.2f}")
import numpy as np
# 1. 重複する数値を含むSeries
scores = pd.Series([85, 90, 78, 85, 92, 90, 78, 88, 95])
print("=== 元のスコア ===")
print(scores)
# 2. 一意の値を取得してソート
unique_scores = pd.unique(scores)
print("\n=== 一意の値(未ソート)===")
print(unique_scores)
# 3. ソート後の一意の値
unique_sorted = np.unique(unique_scores)
print("\n=== 一意の値(ソート後)===")
print(unique_sorted)
# 4. 各一意の値の出現回数を集計
print("\n=== 一意の値と頻度 ===")
value_counts = pd.Series(scores).value_counts()
print(value_counts)
# 5. 一意の値に対応する統計情報を取得
print("\n=== 基本統計 ===")
print(f"一意の値の数: {len(unique_scores)}")
print(f"最小値: {unique_scores.min()}")
print(f"最大値: {unique_scores.max()}")
print(f"平均値: {unique_scores.mean():.2f}")
実行結果の想定:
>--- 原始分数 --- 0 85 1 90 2 78 85、90、78 各出现 2 次,88、95 各出现 1 次。 === 唯一值及频次 === 85 2 90 2 78 2 88 1 95 1 dtype: int === 基本统计 === 唯一值数量: 5 最小值: 78 最大值: 95 平均值: 86.40
コードの解説:
- 〜を使用して
np.unique()結果をソートできます。 - と組み合わせることで
value_counts()各一意の値の出現回数を確認できます。 - 一意の値の配列は、通常の配列と同じように数値計算を行うことができます。
例4:欠損値の処理
pd.unique()は欠損値(NaN)を有効な一意の値として返します。
実例
import pandas as pd
import numpy as np
# 1. 欠損値を含むデータ
data = pd.Series(['a', 'b', np.nan, 'a', None, 'c', np.nan, 'b'])
print("=== 欠損値を含むデータ ===")
print(data)
# 2. 一意の値を取得(NaN は一意の値として扱われます)
unique_with_nan = pd.unique(data)
print("\n=== NaNを含む一意の値 ===")
print(unique_with_nan)
print(f"一意の値の数(NaNを含む): {len(unique_with_nan)}")
# 3. NaNを除外した後の一意の値
unique_no_nan = pd.unique(data[data.notna()])
print("\n=== NaNを除外した後の一意の値 ===")
print(unique_no_nan)
print(f"一意の値の数(NaNを含まない): {len(unique_no_nan)}")
# 4. isna() を使用してNaNがあるかどうかを判定
has_nan = pd.isna(unique_with_nan).any()
print(f"\nNaNが存在するか: {has_nan}")
import numpy as np
# 1. 欠損値を含むデータ
data = pd.Series(['a', 'b', np.nan, 'a', None, 'c', np.nan, 'b'])
print("=== 欠損値を含むデータ ===")
print(data)
# 2. 一意の値を取得(NaN は一意の値として扱われます)
unique_with_nan = pd.unique(data)
print("\n=== NaNを含む一意の値 ===")
print(unique_with_nan)
print(f"一意の値の数(NaNを含む): {len(unique_with_nan)}")
# 3. NaNを除外した後の一意の値
unique_no_nan = pd.unique(data[data.notna()])
print("\n=== NaNを除外した後の一意の値 ===")
print(unique_no_nan)
print(f"一意の値の数(NaNを含まない): {len(unique_no_nan)}")
# 4. isna() を使用してNaNがあるかどうかを判定
has_nan = pd.isna(unique_with_nan).any()
print(f"\nNaNが存在するか: {has_nan}")
実行結果の想定:
=== 包含缺失值的数据 ===
0 a
1 b
2 NaN
3 a
4 None
5 different 'c' appears twice: None and NaN are both treated as missing values.
print("\n=== 唯一值数量(含 NaN): 3 ===")
print("['a', 'b', nan]")
=== 排除 NaN 后的唯一值 ===
['a', 'b', 'c']
唯一值数量(不含 NaN): 3
コードの解説:
- NaNとNoneはどちらも欠損値とみなされ、一意の値の中では1つとしてカウントされます。
- 〜を使用して
data[data.notna()]欠損値を先に除外してから、一意の値を抽出します。 pd.isna()一意の値の配列にNaNが含まれているかどうかを確認できます。
その他の拡張ヒント:
pd.unique()返されるのはNumPy配列です。pandasオブジェクト(Seriesなど)を返す必要がある場合は、Series.unique()Seriesを返すメソッドを使用できます。
Pandas 常用関数