DataFrameの欠損値を特定の値で置き換える
pandasのDataFrame内にある欠損値を、特定の値で置き換えます。
目次
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というカテゴリーに置換されました。
公開日
広告
Pythonでデータ分析カテゴリの投稿
- DataFrameの欠損値を特定の値で置き換える
- Pythonでpandas入門1(データの入力とデータへのアクセス)
- Pythonでpandas入門2(データの追加と削除および並び替え)
- Pythonでpandas入門3(データの統計量の計算)
- Pythonでpandas入門4(データの連結と結合)
- Pythonでpandas入門5(欠損値(NaN)の扱い)
- Pythonでデータを学習用と検証用に分割する
- Pythonでデータ分析入門1(初めての回帰分析)
- Pythonでデータ分析入門2(初めてのロジスティック回帰(2クラス分類))
- Pythonでデータ分析入門3(初めての決定木(多クラス分類))
- Pythonで回帰モデルの評価関数
- Pythonで箱ひげ図を描く
- Python(pandas)でExcelファイルを読み込んでDataFrameにする
- pandasでカテゴリ変数を数値データに変換する
- pandasでクロス集計する
- pandasで同じデータ(要素)がいくつあるか調べる
- pandasで相関係数を計算する
- pandasとseabornでデータの可視化(散布図行列)
- pandasの学習用のデータセットを入手する
- scikit-learnのサンプルデータセットを入手する