6.12. DataFrame Where

  • DataFrame.where(cond, sub) - Replace values where the condition is False

  • DataFrame.mask(cond, sub) - Replace values where the condition is True

6.12.1. SetUp

>>> import pandas as pd
>>>
>>>
>>> df = pd.DataFrame([
...     {'firstname': 'Alice', 'lastname': 'Apricot', 'age': 30},
...     {'firstname': 'Bob', 'lastname': 'Blackthorn', 'age': 31},
...     {'firstname': 'Carol', 'lastname': 'Corn', 'age': 32},
...     {'firstname': 'Dave', 'lastname': 'Durian', 'age': 33},
...     {'firstname': 'Eve', 'lastname': 'Elderberry', 'age': 34},
...     {'firstname': 'Mallory', 'lastname': 'Melon', 'age': 15},
... ], index=['a', 'b', 'c', 'd', 'e', 'f'])
>>>
>>> df
  firstname    lastname  age
a     Alice     Apricot   30
b       Bob  Blackthorn   31
c     Carol        Corn   32
d      Dave      Durian   33
e       Eve  Elderberry   34
f   Mallory       Melon   15

6.12.2. Mask

>>> df.mask((df['age']<18) | (df['age']>65))
  firstname    lastname   age
a     Alice     Apricot  30.0
b       Bob  Blackthorn  31.0
c     Carol        Corn  32.0
d      Dave      Durian  33.0
e       Eve  Elderberry  34.0
f       NaN         NaN   NaN

6.12.3. Where

>>> df.where(df['age']<18)
  firstname lastname   age
a       NaN      NaN   NaN
b       NaN      NaN   NaN
c       NaN      NaN   NaN
d       NaN      NaN   NaN
e       NaN      NaN   NaN
f   Mallory    Melon  15.0
>>> df.mask(df['age']<18, 'n/a')
  firstname    lastname  age
a     Alice     Apricot   30
b       Bob  Blackthorn   31
c     Carol        Corn   32
d      Dave      Durian   33
e       Eve  Elderberry   34
f       n/a         n/a  n/a
>>> df.where(df['age']<18, 'n/a')
  firstname lastname  age
a       n/a      n/a  n/a
b       n/a      n/a  n/a
c       n/a      n/a  n/a
d       n/a      n/a  n/a
e       n/a      n/a  n/a
f   Mallory    Melon   15
>>> df.where(df['age']<18).dropna()
  firstname lastname   age
f   Mallory    Melon  15.0
>>> df.where(df['age']<18)
  firstname lastname   age
a       NaN      NaN   NaN
b       NaN      NaN   NaN
c       NaN      NaN   NaN
d       NaN      NaN   NaN
e       NaN      NaN   NaN
f   Mallory    Melon  15.0
>>> df.where((df['age']<18) | (df['age']>65))
  firstname lastname   age
a       NaN      NaN   NaN
b       NaN      NaN   NaN
c       NaN      NaN   NaN
d       NaN      NaN   NaN
e       NaN      NaN   NaN
f   Mallory    Melon  15.0