pandas.Series.mask 解説


pandas.Series.mask 解説

pandas.Series.mask は、Series オブジェクト内の特定の条件を満たす要素を、別の値に置き換えるためのメソッドです。条件を満たさない要素は元の値のまま保持されます。

構文

Series.mask(cond, other=np.nan, inplace=False, axis=None, level=None, errors='raise', try_cast=False)

引数

  • cond: 条件を指定する Series オブジェクト、ndarray、または条件を返す関数
  • other: 条件を満たす要素に置き換える値。デフォルトは np.nan
  • inplace: True の場合、元の Series オブジェクトを変更します。False の場合は、新しい Series オブジェクトを返します。デフォルトは False
  • axis: 軸指定。デフォルトは None
  • level: レベル指定。デフォルトは None
  • errors: エラー処理方法を指定します。'raise' または 'ignore' のいずれかを指定できます。デフォルトは 'raise'
  • try_cast: 結果を元の型にキャストするかどうかのフラグ。デフォルトは False

戻り値

条件を満たす要素を置き換えた新しい Series オブジェクト

以下の例では、Series オブジェクト s のうち、値が 5 以下の要素を np.nan に置き換えます。

import pandas as pd

s = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
result = s.mask(s <= 5)
print(result)

出力:

0    1.0
1    2.0
2    3.0
3    4.0
4    5.0
5    NaN
6    NaN
7    NaN
8    NaN
9    NaN
dtype: float64
  • cond には、Series オブジェクト、ndarray、または条件を返す関数を使用できます。
  • other には、スカラ値、Series オブジェクト、または値を返す関数を使用できます。
  • inplace を True に設定すると、元の Series オブジェクトが変更されるため、注意が必要です。
  • 条件を満たす要素が Series オブジェクト全体の場合、other の値が Series オブジェクトである必要があります。

応用例

  • 特定の値以下の要素をすべて np.nan に置き換える
  • 特定の条件を満たす要素を別の値に置き換える
  • データの一部をマスクして分析を行う


import pandas as pd

# データの作成
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
s = pd.Series(data)

# 5 以下の要素を NaN に置き換える
result = s.mask(s <= 5)
print(result)
0    1.0
1    2.0
2    3.0
3    4.0
4    5.0
5    NaN
6    NaN
7    NaN
8    NaN
9    NaN
dtype: float64
import pandas as pd

# データの作成
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
s = pd.Series(data)

# 偶数である要素を 100 に置き換える
def is_even(x):
  return x % 2 == 0

result = s.mask(is_even, 100)
print(result)

出力:

0     1
1     2
2    100
3     4
4     5
5    100
6    100
7     8
8    100
9    100
dtype: int64
import pandas as pd

# データの作成
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
s = pd.Series(data)

# 5 以下の要素をマスクして、平均値と標準偏差を計算する
masked_data = s.mask(s <= 5)
print(masked_data.mean())
print(masked_data.std())
6.0
2.8284271247460256


where() メソッドは、Series オブジェクト内の要素を条件に応じて別の値に置き換えることができます。mask() メソッドと似ていますが、以下の点で異なります。

  • 条件を満たす要素を True の値に置き換える
  • 置き換える値を条件ごとに別々に設定できる

利点

  • 条件を満たす要素とそうでない要素を別々に処理できる
  • 置き換える値を柔軟に設定できる

欠点

  • mask() メソッドよりも冗長な記述になる場合がある
import pandas as pd

# データの作成
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
s = pd.Series(data)

# 5 以下の要素を NaN に、それ以外の要素を 100 に置き換える
result = s.where(s <= 5, np.nan, 100)
print(result)
0    100
1    100
2    100
3    100
4    100
5    NaN
6    NaN
7    NaN
8    NaN
9    NaN
dtype: float64

loc 属性

loc 属性は、行インデックスと列インデックスを使用して Series オブジェクトの要素にアクセスおよび設定できます。条件に応じて要素を置き換えるために使用することもできます。

  • シンプルで分かりやすい構文
  • 複雑な条件にも対応できる
  • パフォーマンスが劣る場合がある
import pandas as pd

# データの作成
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
s = pd.Series(data)

# 5 以下の要素を NaN に置き換える
s.loc[s <= 5] = np.nan
print(s)
0    1.0
1    2.0
2    3.0
3    4.0
4    5.0
5    NaN
6    NaN
7    NaN
8    NaN
9    NaN
dtype: float64

np.where() 関数

np.where() 関数は、NumPy 配列に対して条件に応じて要素を置き換えることができます。Series オブジェクトの値を置き換えるために使用することもできますが、pandas 専用のメソッドではないため、where() メソッドや loc 属性よりも冗長な記述になる場合があります。

  • NumPy 配列だけでなく、Series オブジェクトにも使用できる
  • 柔軟性の高い条件式を使用できる
  • pandas 専用のメソッドではないため、冗長な記述になる場合がある
import pandas as pd
import numpy as np

# データの作成
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
s = pd.Series(data)

# 5 以下の要素を NaN に、それ以外の要素を 100 に置き換える
result = np.where(s <= 5, np.nan, 100)
print(result)
[ 100.  100.  100.   100.   100.    NaN    NaN    NaN    NaN    NaN]

リスト内包表記

リスト内包表記は、条件に応じて新しいリストを作成するための簡潔な方法です。Series オブジェクトの値を置き換えるために使用することもできますが、データ量が多い場合はパフォーマンスが低下する可能性があります。

  • 簡潔で分かりやすい構文
  • データ量が多い場合はパフォーマンスが低下する可能性がある
import pandas as pd

# データの作成
data =