Pandas df.fillna() 関数

Pandas 常用函数Pandas よく使う関数


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)

期待される実行結果:

原始数据:
    姓名   年龄    薪资  部门
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

コードの解説:

  1. 複数の欠損値を含む DataFrame を作成しました。
  2. df.fillna(0) を使用してdf.fillna(0)すべての欠損値を 0 に置き換えます。
  3. この方法はシンプルで直接的ですが、すべてのシーンに適しているわけではありません。例えば、年齢や給与を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)

期待される実行結果:

原始数据:
    姓名   年龄    薪资  部门  绩效
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)

期待される実行結果:

原始数据:
    姓名  数学  英语  物理
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)

期待される実行結果:

原始数据:
        日期   温度   湿度
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)

実行結果の想定:

原始数据:
     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)

実行結果の想定:

原始数据:
   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 常用函数Pandas よく使う関数

その他の拡張