Pandas df.fillna() 関数
df.fillna()は、Pandas で欠損値を埋めるために使用される関数です。
とdropna()欠損値を削除するのとは異なり、fillna()指定した値、平均値、中央値、前方埋め、後方埋めなどの方法で欠損データを埋めることができます。これは、データの完全性と分析の正確性を維持する上で非常に役立ちます。
基本構文とパラメータ
fillna()は DataFrame のメンバー関数であり、ドット演算子を介して.呼び出します。
構文形式
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
パラメータの説明
| パラメータ | 型 | 必須かどうか | 説明 | デフォルト値 |
|---|---|---|---|---|
| value | scalar, dict, Series, DataFrame | オプション | 欠損値を埋めるための値です。定数、辞書(列ごとに異なる値を指定)、Series、または DataFrame を指定できます。 | None |
| method | str | オプション | 埋め方(メソッド)です。'ffill' 或 'pad'「ffill」は前の値で埋める(前方埋め)ことを表します;'bfill' 或 'backfill'「bfill」は後ろの値で埋める(後方埋め)ことを表します。 |
None |
| axis | int または str | オプション | 埋める方向を指定します。0 或 'index'行方向に埋めることを表します;1 或 'columns'列方向に埋めることを表します。ただし、methodmethod がNoneNone でない場合にのみ有効です。 |
0 |
| inplace | bool | オプション | もし True の場合True、元の DataFrame を直接変更し、新しいオブジェクトは返しません。もし False の場合False、新しい DataFrame を返し、元のデータは変更されません。 |
False |
| limit | int | オプション | 連続して埋める最大数を指定します。例えば limit=1 に設定すると、limit=11回につき1つの欠損値だけを埋めることを表します。 |
None |
| downcast | dict または str | オプション | データ型をダウンキャストする規則を指定します。例:float64 を int64 に変換します。 | None |
戻り値の説明
- 新しい DataFrame を返します(もし
inplace=Falseinplace=False の場合)。またはNone(もしinplace=True)。 - inplace=True の場合、返される DataFrame の欠損値は埋められています。
例
一連の例を通して、fillna()の使い方を完全にマスターしましょう。
例1:定数ですべての欠損値を埋める
最も簡単な使い方は、定数ですべての欠損値を埋めることです。
例
import pandas as pd
import numpy as np
# 欠損値を含む DataFrame を作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, np.nan, 35, np.nan], # 欠損値
'薪资': [5000, 6000, np.nan, 8000], # 欠損値
'部门': ['技术', '市场', '技术', np.nan] # 欠損値
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 定数 0 ですべての欠損値を埋める
df_filled = df.fillna(0)
print("0で埋めた後のデータ:")
print(df_filled)
import numpy as np
# 欠損値を含む DataFrame を作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, np.nan, 35, np.nan], # 欠損値
'薪资': [5000, 6000, np.nan, 8000], # 欠損値
'部门': ['技术', '市场', '技术', np.nan] # 欠損値
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 定数 0 ですべての欠損値を埋める
df_filled = df.fillna(0)
print("0で埋めた後のデータ:")
print(df_filled)
期待される実行結果:
原始数据:
姓名 年龄 薪资 部门
0 张三 25.0 5000.0 技术
1 李四 NaN 6000.0 市场
2 王五 35.0 NaN 技术
3 赵六 NaN 8000.0 NaN
==================================================
用0填充后的数据:
名称 年龄 薪资 部门
0 张三 25.0 5000.0 技术
1 李四 0.0 6000.0 市场
2 王五 35.0 0.0 技术
3 赵六 0.0 8000.0 0
コードの解説:
- 複数の欠損値を含む DataFrame を作成しました。
- df.fillna(0) を使用して
df.fillna(0)すべての欠損値を 0 に置き換えます。 - この方法はシンプルで直接的ですが、すべてのシーンに適しているわけではありません。例えば、年齢や給与を0で埋めるのはあまり合理的ではないかもしれません。
例2:辞書を使用して列ごとに異なる埋め値を指定する
列ごとに異なる埋め値を指定できるため、データをより合理的にできます。
例
import pandas as pd
import numpy as np
# 欠損値を含む DataFrame を作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, np.nan, 35, np.nan],
'薪资': [5000, 6000, np.nan, 8000],
'部门': ['技术', '市场', '技术', np.nan],
'绩效': [85, 90, np.nan, 95]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 辞書を使用して列ごとに異なる埋め値を指定する
fill_values = {
'年龄': 30, # 年齢の欠損値は30で埋める
'薪资': 6500, # 給与の欠損値は6500で埋める
'部门': '未分配', # 部門の欠損値は「未分配」で埋める
'绩效': 80 # 業績の欠損値は80で埋める
}
df_filled = df.fillna(fill_values)
print("列ごとに異なる値で埋めた後のデータ:")
print(df_filled)
import numpy as np
# 欠損値を含む DataFrame を作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, np.nan, 35, np.nan],
'薪资': [5000, 6000, np.nan, 8000],
'部门': ['技术', '市场', '技术', np.nan],
'绩效': [85, 90, np.nan, 95]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 辞書を使用して列ごとに異なる埋め値を指定する
fill_values = {
'年龄': 30, # 年齢の欠損値は30で埋める
'薪资': 6500, # 給与の欠損値は6500で埋める
'部门': '未分配', # 部門の欠損値は「未分配」で埋める
'绩效': 80 # 業績の欠損値は80で埋める
}
df_filled = df.fillna(fill_values)
print("列ごとに異なる値で埋めた後のデータ:")
print(df_filled)
期待される実行結果:
原始数据:
姓名 年龄 薪资 部门 绩效
0 张三 25.0 5000.0 技术 85
1 李四 NaN 6000.0 市场 90
2 王五 35.0 NaN 技术 NaN
3 赵六 NaN 8000.0 NaN 95
==================================================
不同列用不同值填充后的数据:
姓名 年龄 薪资 部门 绩效
0 张三 25.0 5000.0 技术 85
1 李四 30.0 6000.0 市场 90
2 王五 35.0 6500.0 技术 80
3 赵六 30.0 8000.0 未分配 95
コードの解説:
- 辞書を使用して
fill_values、各列に対して合理的な埋め値を指定しました。 - この方法はより柔軟で、ビジネスロジックに応じて異なるフィールドに適切なデフォルト値を設定できます。
例3:平均値または中央値で数値列を埋める
数値型データの場合、平均値や中央値で埋めるのは一般的で合理的な方法です。
例
import pandas as pd
import numpy as np
# 欠損値を含む DataFrame を作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'数学': [85, 90, np.nan, 78, 92],
'英语': [88, np.nan, 82, 85, 90],
'物理': [np.nan, 85, 90, 88, 95]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 各列の平均値を計算する
math_mean = df['数学'].mean()
english_mean = df['英语'].mean()
physics_mean = df['物理'].mean()
print(f"数学均值: {math_mean:.2f}")
print(f"英语均值: {english_mean:.2f}")
print(f"物理均值: {physics_mean:.2f}")
print("=" * 50)
# 平均値で埋める
df_filled = df.fillna({
'数学': math_mean,
'英语': english_mean,
'物理': physics_mean
})
print(平均値で補完した後のデータ:)
print(df_filled)
import numpy as np
# 欠損値を含む DataFrame を作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'数学': [85, 90, np.nan, 78, 92],
'英语': [88, np.nan, 82, 85, 90],
'物理': [np.nan, 85, 90, 88, 95]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 各列の平均値を計算する
math_mean = df['数学'].mean()
english_mean = df['英语'].mean()
physics_mean = df['物理'].mean()
print(f"数学均值: {math_mean:.2f}")
print(f"英语均值: {english_mean:.2f}")
print(f"物理均值: {physics_mean:.2f}")
print("=" * 50)
# 平均値で埋める
df_filled = df.fillna({
'数学': math_mean,
'英语': english_mean,
'物理': physics_mean
})
print(平均値で補完した後のデータ:)
print(df_filled)
期待される実行結果:
原始数据:
姓名 数学 英语 物理
0 张三 85.0 88.0 NaN
1 李四 90.0 NaN 85.0
2 王五 NaN 82.0 90.0
3 赵六 78.0 85.0 88.0
4 钱七 92.0 90.0 95.0
==================================================
数学均值: 86.25
英语均值: 86.25
物理均值: 89.50
==================================================
用均值填充后的数据:
姓名 数学 英语 物理
0 张三 85.0 88.0 89.5
1 李四 90.0 86.25 85.0
2 王五 86.25 82.0 90.0
3 赵六 78.0 85.0 88.0
4 钱七 92.0 90.0 95.0
コードの解説:
- df.mean() を使用して
df['列名'].mean()各列の平均値を計算します。 - 計算した平均値を埋め値として使用することで、データの全体的な分布特性を維持しつつ、欠損値の問題を解決できます。
例4:前方埋め(ffill)と後方埋め(bfill)を使用する
前方埋めは前の有効な値で欠損値を埋め、後方埋めは後ろの有効な値で欠損値を埋めます。
例
import pandas as pd
import numpy as np
# 欠損値を含む DataFrame を作成する
data = {
'日期': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05'],
'温度': [20, np.nan, 22, np.nan, 25],
'湿度': [60, 65, np.nan, 70, 75]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 前方埋め:前の値で欠損値を埋める
df_ffill = df.fillna(method='ffill')
print(前方充填(ffill)後のデータ:)
print(df_ffill)
print("=" * 50)
# 後方埋め:後ろの値で欠損値を埋める
df_bfill = df.fillna(method='bfill')
print(後方充填(bfill)後のデータ:)
print(df_bfill)
import numpy as np
# 欠損値を含む DataFrame を作成する
data = {
'日期': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05'],
'温度': [20, np.nan, 22, np.nan, 25],
'湿度': [60, 65, np.nan, 70, 75]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 前方埋め:前の値で欠損値を埋める
df_ffill = df.fillna(method='ffill')
print(前方充填(ffill)後のデータ:)
print(df_ffill)
print("=" * 50)
# 後方埋め:後ろの値で欠損値を埋める
df_bfill = df.fillna(method='bfill')
print(後方充填(bfill)後のデータ:)
print(df_bfill)
期待される実行結果:
原始数据:
日期 温度 湿度
0 2024-01-01 20.0 60.0
1 2024-01-02 NaN 65.0
2 2024-01-03 22.0 NaN
3 2024-01-04 NaN 70.0
4 2024-01-05 25.0 75.0
==================================================
向前填充(ffill)后的数据:
日期 温度 湿度
0 2024-01-01 20.0 60.0
1 2024-01-02 20.0 65.0 # 用前一个值20填充
2 2024-01-03 22.0 65.0 # 用前一个值65填充
3 2024-01-04 22.0 70.0 # 用前一个值22填充
4 2024-01-05 25.0 75.0
==================================================
向后填充(bfill)后的数据:
日期 温度 湿度
0 2024-01-01 20.0 60.0
1 2024-01-02 22.0 65.0 # 用后一个值22填充
2 2024-01-03 22.0 70.0 # 用后一个值70填充
填充
3 2024-01-04 25.0 70.0 # 用后一个值25填充
4 2024-01-05 25.0 75.0
コードの解説:
- 前方埋め(
ffillffill):インデックス1の行の温度が欠損しているため、インデックス0の行の20で埋めます。インデックス3の行の温度が欠損しているため、インデックス2の行の22で埋めます。 - 後方埋め(
bfillbfill):インデックス1の行の温度が欠損しているため、インデックス2の行の22で埋めます。インデックス3の行の温度が欠損しているため、インデックス4の行の25で埋めます。 - この方法は、株価や気温記録などの時系列データに適しています。
例5:limitパラメータを使用して埋める数を制限する
limitこのパラメータは、連続して埋める最大数を制限できます。
例
import pandas as pd
import numpy as np
# 連続した欠損値を複数含む DataFrame を作成する
data = {
'A': [1, np.nan, np.nan, np.nan, 5],
'B': [1, 2, np.nan, np.nan, 5]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 前方填充(forward fill)だが、連続する欠損値は毎回1つだけに制限する
df_filled = df.fillna(method='ffill', limit=1)
print("連続する欠損値の補完数を1に制限した後のデータ:")
print(df_filled)
import numpy as np
# 連続した欠損値を複数含む DataFrame を作成する
data = {
'A': [1, np.nan, np.nan, np.nan, 5],
'B': [1, 2, np.nan, np.nan, 5]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print("=" * 50)
# 前方填充(forward fill)だが、連続する欠損値は毎回1つだけに制限する
df_filled = df.fillna(method='ffill', limit=1)
print("連続する欠損値の補完数を1に制限した後のデータ:")
print(df_filled)
実行結果の想定:
原始数据:
A B
0 1.0 1.0
1 NaN 2.0
2 NaN NaN
3 NaN NaN
4 5.0 5.0
==================================================
限制连续填充数量为1后的数据:
A B
0 1.0 1.0
1 1.0 2.0 # 填充1个
2 NaN 2.0 # 达到limit,不再填充
3 NaN NaN # 继续不填充
4 5.0 5.0
コードの解説:
- 列Aでは、1行目の欠損値が1で補完されるが、2行目と3行目はlimit=1に達したため、補完されない。
- 列Bでは、2行目の欠損値が2で補完されるが、3行目はlimit=1に達したため、補完されない。
例6:補間法で欠損値を埋める
Pandasにはさらにinterpolate()メソッドを使用して欠損値を補間補完することができます。これは数値データに適しています。
例
import pandas as pd
import numpy as np
# 欠損値を含むDataFrameを作成する
data = {
'x': [1, 2, 3, 4, 5],
'y': [10, np.nan, 30, np.nan, 50]
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print("=" * 50)
# 線形補間を使用して補完する
df_interpolated = df.copy()
df_interpolated['y'] = df_interpolated['y'].interpolate(method='linear')
print("線形補間で補完した後のデータ:")
print(df_interpolated)
import numpy as np
# 欠損値を含むDataFrameを作成する
data = {
'x': [1, 2, 3, 4, 5],
'y': [10, np.nan, 30, np.nan, 50]
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print("=" * 50)
# 線形補間を使用して補完する
df_interpolated = df.copy()
df_interpolated['y'] = df_interpolated['y'].interpolate(method='linear')
print("線形補間で補完した後のデータ:")
print(df_interpolated)
実行結果の想定:
原始数据: x y 0 1 10.0 1 2 NaN 2 3 30.0 3 4 NaN 4 5 50.0 ================================================== 线性插值填充后的数据: x y 0 1 10.0 1 2 20.0 # 插值:10 + (30-10)/(3-1)*(2-1) = 20 2 3 30.0 3 4 40.0 # 插值:30 + (50-30)/(5-3)*(4-3) = 40 4 5 50.0
コードの解説:
- 線形補間は、前後の既知の値に基づいて欠損値を計算します。
- 1行目: 10 + (30-10)/(3-1)*(2-1) = 20。
- 3行目: 30 + (50-30)/(5-3)*(4-3) = 40。
- 補間法は、数値が線形に変化するデータに適しています。
注意事項
fillna()デフォルトでは元のDataFrameは変更されません。元のDataFrameを変更したい場合は、inplace=Trueパラメータを使用してください。- 注意
methodこのパラメータは将来のPandasバージョンで非推奨になる可能性があります。代わりにffill()とbfill()メソッドを使用することをお勧めします。 - 平均値で補完する場合、データに極端な値(外れ値)が存在するならば、中央値で補完することを検討できます。その方がより堅牢(ロバスト)です。
- カテゴリデータ(部門、役職など)の場合、最頻値(モード)または明確なカテゴリ(例:「不明」)で補完することをお勧めします。
- 欠損値を補完する前に、欠損の原因とパターンを分析し、最も適切な補完方法を選択することをお勧めします。
その他の拡張
Pandas よく使う関数