DataFrameの欠損値を特定の値で置き換える

pandasのDataFrame内にある欠損値を、特定の値で置き換えます。

目次

  1. fillnaメソッド
  2. 数値データの欠損値を置換する
  3. 文字列データの欠損値を置換する
  4. カテゴリー変数の欠損値を置換する

fillnaメソッド

欠損値を置換するには、DataFrameやSeriesのfillnaメソッドを使用します。

re = Series.fillna([value], [method], [axis], [inplace], [limit], [downcast])
re = DataFrame.fillna([value], [method], [axis], [inplace], [limit], [downcast])

引数

内容

value

規定値はNone。欠損値を置き換えるためのscalarまたはdictあるいはSeries/DataFrame。

method

規定値はNone。

axis

規定値は0。

inplace

bool

規定値はFalse。Trueにした場合は、元のSeriesを置き換える。

limit

int

規定値はNone。

downcast

dict

規定値はNone。

re

置換後のSeriesまたはDataFrame。inplace引数にTrueを指定した場合の戻り値はNone。

数値データの欠損値を置換する

例として、seabornのtitanicデータを使用して、欠損値の置換をしてみます。

seabornのtitanicサンプルデータを読み込んで、各列のデータ型と、欠損値の有無を確認します。

import seaborn as sns
import pandas as pd

df = sns.load_dataset('titanic')
print(df.info())
print(df.isnull().sum())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
 #   Column       Non-Null Count  Dtype
---  ------       --------------  -----
 0   survived     891 non-null    int64
 1   pclass       891 non-null    int64
 2   sex          891 non-null    object
 3   age          714 non-null    float64
 4   sibsp        891 non-null    int64
 5   parch        891 non-null    int64
 6   fare         891 non-null    float64
 7   embarked     889 non-null    object
 8   class        891 non-null    category
 9   who          891 non-null    object
 10  adult_male   891 non-null    bool
 11  deck         203 non-null    category
 12  embark_town  889 non-null    object
 13  alive        891 non-null    object
 14  alone        891 non-null    bool
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.7+ KB
None


survived         0
pclass           0
sex              0
age            177
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
deck           688
embark_town      2
alive            0
alone            0
dtype: int64

欠損値が存在する列が3つあることがわかりました。

Dtype

age

float64

embarked

object

deck

category

浮動小数点型のage列の欠損値を、-1に置換します。

まず、欠損値を表示してみます。

print(df[df['age'].isnull()]['age'])

5     NaN
17    NaN
19    NaN
26    NaN
28    NaN
       ..
859   NaN
863   NaN
868   NaN
878   NaN
888   NaN
Name: age, Length: 177, dtype: float64

fillnaメソッドに-1を指定して置換を実行し、age列が-1の行を表示します。

df['age'].fillna(-1,inplace=True)
print(df[df['age']==-1]['age'])

5     -1.0
17    -1.0
19    -1.0
26    -1.0
28    -1.0
      ...
859   -1.0
863   -1.0
868   -1.0
878   -1.0
888   -1.0
Name: age, Length: 177, dtype: float64

文字列データの欠損値を置換する

embarked列には、SとCとQの文字のいずれかのデータが入っています。データがない行は欠損値です。

embarked列の欠損値をunknownに置換します。

まず、欠損値を表示してみます。

print(df[df['embarked'].isnull()]['embarked'])

61     NaN
829    NaN
Name: embarked, dtype: object

61行と829行の2つのデータですね。

では、fillnaメソッドで置換を実行します。

df['embarked'].fillna('unknown',inplace=True)
print(df[df['embarked']=='unknown']['embarked'])

61     unknown
829    unknown
Name: embarked, dtype: object

欠損値が指定した文字列に置換されました。

カテゴリー変数の欠損値を置換する

deck列のDtypeはcategoryになっています。どういう値が入っているのか調べてみます。

print(df[['deck']].value_counts())

deck
C       59
B       47
D       33
E       32
A       15
F       13
G        4
Name: count, dtype: int64

文字のカテゴリーになっています。カテゴリー変数の列に対して単純にfillnaメソッドで文字列の置換をしようとすると、エラーになります。

欠損値をunknownというカテゴリーに置換するとしましょう。 まず最初にdeck列にunknownというカテゴリーを追加しなければなりません。 カテゴリーの追加は、add_categoriesというメソッドで行います。 その後に、fillnaメソッドで欠損値をunknownというカテゴリーに置換します。

df['deck'] = df['deck'].cat.add_categories(['unknown'])
df['deck'].fillna('unknown', inplace=True)
print(df[['deck']].value_counts())

deck
unknown    688
C           59
B           47
D           33
E           32
A           15
F           13
G            4
Name: count, dtype: int64

688個の欠損値がunknownというカテゴリーに置換されました。

公開日

広告