Pynote

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

pandas - where、mask で条件に該当する要素を置換する。

Series.where

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

cond が True の要素はそのまま、False の要素は other の要素で置換した Series を返す。
other はデフォルトは nan だが、指定するとその値で置換される。

import pandas as pd

s = pd.Series([0, 1, 2, 3, 4])

# False の要素は、nan (デフォルト) で置換される。
s2 = s.where(s % 2 == 0)
print(s2)
# 0    0.0
# 1    NaN
# 2    2.0
# 3    NaN
# 4    4.0
# dtype: float64

# False の要素は、-s で置換される。
s2 = s.where(s % 2 == 0, -s)
print(s2)
# 0    0
# 1   -1
# 2    2
# 3   -3
# 4    4
# dtype: int64

cond の指定方法

Series と同じ要素数のブール型の配列で指定する。

import pandas as pd

s = pd.Series([0, 1, 2, 3, 4])

# False の要素は、nan (デフォルト) で置換される。
s2 = s.where(s % 2 == 0)
print(s2)
# 0    0.0
# 1    NaN
# 2    2.0
# 3    NaN
# 4    4.0
# dtype: float64

ブール値を返す関数を指定する。

import pandas as pd

s = pd.Series([0, 1, 2, 3, 4])

# False の要素は、other=-1 に置換される。
s2 = s.where(lambda x: x % 2 == 0)
print(s2)
# 0    0.0
# 1    NaN
# 2    2.0
# 3    NaN
# 4    4.0
# dtype: float64

inplace で置換する。

通常は元の Series のコピーを作成し、cond に基づき、値を置換して返すが、
inplace=True とした場合は元の Series を置換する。

import pandas as pd

s = pd.Series([0, 1, 2, 3, 4])

# inplace で実行する。
s.where(s % 2 == 0, inplace=True)
print(s)
# 0    0.0
# 1    NaN
# 2    2.0
# 3    NaN
# 4    4.0
# dtype: float64

DataFrame.where

cond が True の要素はそのまま、False の要素は other の要素で置換した DataFrame を返す。
other はデフォルトは nan だが、指定するとその値で置換される。

import pandas as pd

df = pd.DataFrame(
    {
        "A": [1, 2, 3],
        "B": [4, 5, 6],
        "C": [7, 8, 9],
    }
)

df2 = df.where(df % 2 == 0)
print(df2)
#      A    B    C
# 0  NaN  4.0  NaN
# 1  2.0  NaN  8.0
# 2  NaN  6.0  NaN

df2 = df.where(df % 2 == 0, -df)
print(df2)
#    A  B  C
# 0 -1  4 -7
# 1  2 -5  8
# 2 -3  6 -9

cond の指定方法

DataFrame と同じ形状のブール型の配列で指定する。

import pandas as pd

df = pd.DataFrame(
    {
        "A": [1, 2, 3],
        "B": [4, 5, 6],
        "C": [7, 8, 9],
    }
)

df2 = df.where(df % 2 == 0, -df)
print(df2)
#    A  B  C
# 0 -1  4 -7
# 1  2 -5  8
# 2 -3  6 -9

ブール値を返す関数を指定する。

import pandas as pd

df = pd.DataFrame(
    {
        "A": [1, 2, 3],
        "B": [4, 5, 6],
        "C": [7, 8, 9],
    }
)

df2 = df.where(lambda x: x % 2 == 0, -df)
print(df2)
#    A  B  C
# 0 -1  4 -7
# 1  2 -5  8
# 2 -3  6 -9

inplace で置換する。

通常は元の DataFrame のコピーを作成し、cond に基づき、値を置換して返すが、
inplace=True とした場合は元の DataFrame を置換する。

import pandas as pd

df = pd.DataFrame(
    {
        "A": [1, 2, 3],
        "B": [4, 5, 6],
        "C": [7, 8, 9],
    }
)

df.where(df % 2 == 0, -df, inplace=True)
print(df)
#    A  B  C
# 0 -1  4 -7
# 1  2 -5  8
# 2 -3  6 -9

Series.mask

Series.where と反対の処理になる。
cond が False の要素はそのまま、True の要素は other の要素で置換した Series を返す。
other はデフォルトは nan だが、指定するとその値で置換される。

import pandas as pd

s = pd.Series([0, 1, 2, 3, 4])

# True の要素は、nan (デフォルト) で置換される。
s2 = s.mask(s % 2 == 0)
print(s2)
# 0    NaN
# 1    1.0
# 2    NaN
# 3    3.0
# 4    NaN
# dtype: float64

# True の要素は、-s で置換される。
s2 = s.mask(s % 2 == 0, -s)
print(s2)
# 0    0
# 1    1
# 2   -2
# 3    3
# 4   -4
# dtype: int64

DataFrame.mask

DataFrame.where と反対の処理になる。
cond が False の要素はそのまま、True の要素は other の要素で置換した DataFrame を返す。
other はデフォルトは nan だが、指定するとその値で置換される。

import pandas as pd

df = pd.DataFrame(
    {
        "A": [1, 2, 3],
        "B": [4, 5, 6],
        "C": [7, 8, 9],
    }
)

df2 = df.mask(df % 2 == 0)
print(df2)
#      A    B    C
# 0  1.0  NaN  7.0
# 1  NaN  5.0  NaN
# 2  3.0  NaN  9.0

df2 = df.mask(df % 2 == 0, -df)
print(df2)
#    A  B  C
# 0  1 -4  7
# 1 -2  5 -8
# 2  3 -6  9