Pandasでデータを扱っていると、空欄や NaN が含まれていて、「fillna() はどう使うのか」「とりあえず 0 で埋めてよいのか」「dropna() との違いは何か」と迷いやすいです。 特に、データ分析では欠損値がよく出てくるため、ここがあいまいなままだと集計や可視化の前処理でつまずきやすくなります。
fillna() は、DataFrameを整えるうえでとても基本的な機能です。 ただし、欠損値は何でも同じように埋めればよいわけではなく、列の意味に応じて埋め方を考えることが大切です。
この記事では、pandas fillna() の基本的な使い方、列ごとの補完、平均値で埋める方法、dropna() や isnull() との違い、初心者が迷いやすい注意点までやさしく整理します。
読み終えるころには、fillna() を単なる文法としてではなく、同じサンプルデータの各列を見ながら、前処理の中でどう使えばよいかを判断しやすくなります。
この記事でわかること
fillna()が何をする機能なのか- 欠損値を
0、文字列、平均値などで埋める基本的な方法 - 列ごとに異なる値で補完する書き方
isnull()やdropna()との違い- 初心者が迷いやすい注意点と、まず覚えるべき使い方
fillna()とは?まず押さえたい基本
fillna() は、欠損値(NaN)を別の値で埋めるための機能です。
PandasでCSVを読み込んだり、DataFrameを確認したりすると、次のようなデータに出会うことがあります。
売上が一部空欄になっているカテゴリや担当者が未入力になっている在庫数や来店者数に欠損が含まれている
この記事では、1つの実務寄りサンプルデータを使いながら、列の意味に応じて fillna() をどう使い分けるかを順に確認します。
fillna()の基本的な使い方
DataFrame全体の欠損値を同じ値で埋める
最初は、sales_df 全体に対して fillna(0) を使う基本形を確認します。 実務ではこのまま使うと不自然になることもありますが、fillna() の動きをつかむ入口としては分かりやすい例です。
import pandas as pd
import numpy as np
sales_df = pd.DataFrame({
"日付": pd.to_datetime([
"2024-04-01", "2024-04-02", "2024-04-03", "2024-04-04", "2024-04-05"
]),
"商品": ["りんご", "みかん", "バナナ", "ぶどう", "もも"],
"カテゴリ": ["果物", np.nan, "果物", np.nan, "果物"],
"売上": [1200, np.nan, 950, np.nan, 1400],
"在庫数": [10, np.nan, 5, np.nan, 8],
"担当者": ["田中", np.nan, "佐藤", np.nan, "鈴木"],
"来店者数": [25, np.nan, np.nan, 30, 28]
})
print(sales_df)
| 日付 | 商品 | カテゴリ | 売上 | 在庫数 | 担当者 | 来店者数 | |
|---|---|---|---|---|---|---|---|
| 0 | 2024-04-01 | りんご | 果物 | 1200.0 | 10.0 | 田中 | 25.0 |
| 1 | 2024-04-02 | みかん | |||||
| 2 | 2024-04-03 | バナナ | 果物 | 950.0 | 5.0 | 佐藤 | |
| 3 | 2024-04-04 | ぶどう | 30.0 | ||||
| 4 | 2024-04-05 | もも | 果物 | 1400.0 | 8.0 | 鈴木 | 28.0 |
実行すると、ECや小売の売上管理をイメージした 1つの実務寄りサンプルデータ が表示されます。
この記事では、この sales_df を使って、
売上の欠損をどう埋めるかカテゴリや担当者のような文字列列をどう扱うか在庫数や来店者数のような数値列をどう考えるか
を順に確認していきます。
df = sales_df.copy()
df_filled = df.fillna(0)
print(df_filled)
| 日付 | 商品 | カテゴリ | 売上 | 在庫数 | 担当者 | 来店者数 | |
|---|---|---|---|---|---|---|---|
| 0 | 2024-04-01 | りんご | 果物 | 1200.0 | 10.0 | 田中 | 25.0 |
| 1 | 2024-04-02 | みかん | 0 | 0.0 | 0.0 | 0 | 0.0 |
| 2 | 2024-04-03 | バナナ | 果物 | 950.0 | 5.0 | 佐藤 | 0.0 |
| 3 | 2024-04-04 | ぶどう | 0 | 0.0 | 0.0 | 0 | 30.0 |
| 4 | 2024-04-05 | もも | 果物 | 1400.0 | 8.0 | 鈴木 | 28.0 |
実行すると、sales_df の欠損値がすべて 0 に置き換わります。 このように fillna(0) と書くと、欠損値をまとめて同じ値で埋められます。
ただし、今回のサンプルでは カテゴリ や 担当者 のような文字列列まで 0 になるため、実務ではこのまま一括で使わないことも多いです。 そのため次のセルからは、同じ sales_df の列ごとに埋め方を変える例を見ていきます。
# 基本形
# df.fillna(値)
※ 上の1行は「書き方の形」を示したものです。実行する場合は 値 を具体的な数値や文字列に置き換えてください。
まずはこの形を覚えると、欠損値処理の入口をつかみやすいです。 ただし、どの列にも同じ値が入るため、実際には列ごとに埋め方を変えることも多いです。
特定の列だけを埋める
ここでは、同じ sales_df の中でも 売上 列だけ を対象にして欠損値を埋めます。 実務でも、まず必要な列だけを個別に処理する形はとてもよく使います。
df = sales_df.copy()
df["売上"] = df["売上"].fillna(0)
print(df)
| 日付 | 商品 | カテゴリ | 売上 | 在庫数 | 担当者 | 来店者数 | |
|---|---|---|---|---|---|---|---|
| 0 | 2024-04-01 | りんご | 果物 | 1200.0 | 10.0 | 田中 | 25.0 |
| 1 | 2024-04-02 | みかん | 0.0 | ||||
| 2 | 2024-04-03 | バナナ | 果物 | 950.0 | 5.0 | 佐藤 | |
| 3 | 2024-04-04 | ぶどう | 0.0 | 30.0 | |||
| 4 | 2024-04-05 | もも | 果物 | 1400.0 | 8.0 | 鈴木 | 28.0 |
実行すると、売上 列の NaN だけが 0 に変わります。 他の列には影響しません。
この書き方はとてもよく使います。 特定の列だけを安全に処理したいときに便利です。
よく使うパターン・実例
文字列列の欠損を「不明」で埋める
ここでは、sales_df の カテゴリ 列を使って、文字列列の欠損を "不明" で補完します。
df = sales_df.copy()
df["カテゴリ"] = df["カテゴリ"].fillna("不明")
print(df)
| 日付 | 商品 | カテゴリ | 売上 | 在庫数 | 担当者 | 来店者数 | |
|---|---|---|---|---|---|---|---|
| 0 | 2024-04-01 | りんご | 果物 | 1200.0 | 10.0 | 田中 | 25.0 |
| 1 | 2024-04-02 | みかん | 不明 | ||||
| 2 | 2024-04-03 | バナナ | 果物 | 950.0 | 5.0 | 佐藤 | |
| 3 | 2024-04-04 | ぶどう | 不明 | 30.0 | |||
| 4 | 2024-04-05 | もも | 果物 | 1400.0 | 8.0 | 鈴木 | 28.0 |
実行すると、カテゴリ 列の欠損値が "不明" に変わります。
このような補完は、集計前の確認や value_counts() でカテゴリ別件数を見たいときに便利です。 空欄のままだと見落としやすい情報も、"不明" として残すと把握しやすくなります。
数値列の欠損を平均値で埋める
ここでは、sales_df の 売上 列を使って、数値列の欠損を平均値で埋める流れを確認します。 0 を入れると意味が変わりそうな数値列で、まず検討しやすい方法です。
df = sales_df.copy()
mean_sales = df["売上"].mean()
df["売上"] = df["売上"].fillna(mean_sales)
print("売上の平均値:", mean_sales)
print(df[["日付", "商品", "売上"]])
売上の平均値: 1183.3333333333333
| 日付 | 商品 | 売上 | |
|---|---|---|---|
| 0 | 2024-04-01 | りんご | 1200.000000 |
| 1 | 2024-04-02 | みかん | 1183.333333 |
| 2 | 2024-04-03 | バナナ | 950.000000 |
| 3 | 2024-04-04 | ぶどう | 1183.333333 |
| 4 | 2024-04-05 | もも | 1400.000000 |
実行すると、売上 が欠損していた行に 売上 列の平均値が入ります。
今回のサンプルでは、売上 は「本当に0円だった」のか「未入力なのか」で意味が変わります。 そのため、単純に 0 で埋めるより、まず平均値補完を考える例として見ると理解しやすいです。
平均値以外の補完方法にも触れておく
数値列の補完では、平均値だけでなく 中央値 や 最頻値 を使うこともあります。 どれが適しているかは、列の性質によって変わります。
- 平均値: 全体のバランスを見て補完したいとき
- 中央値: 外れ値の影響を受けにくくしたいとき
- 最頻値: もっともよく出る値で補完したいとき
ここでも、同じ sales_df の 売上 列を使って確認します。
df = sales_df.copy()
mean_sales = df["売上"].mean()
median_sales = df["売上"].median()
mode_sales = df["売上"].mode()
print("平均値:", mean_sales)
print("中央値:", median_sales)
print("最頻値の候補:", mode_sales.tolist())
平均値: 1183.3333333333333
中央値: 1200.0
最頻値の候補: [950.0, 1200.0, 1400.0]
今回のサンプルでは 売上 の値がすべて1回ずつしか登場しないため、mode() は複数の候補を返します。 つまり、このデータでは「最頻値が1つに決まっている」とは言いにくい状態です。
ただし、実データでは同じ価格帯や同じ売上額が繰り返し現れることもあり、そのような場合は 最頻値 で補完する考え方が役立つことがあります。
そのため、
- 極端に大きい売上が一部にある → 中央値 を検討しやすい
- 決まった価格帯が多い → 最頻値 を検討しやすい
という考え方も覚えておくと、補完方法を選びやすくなります。 初心者のうちは、まず平均値を押さえたうえで、「中央値や最頻値もある」と知っておくだけでも十分です。
列ごとに異なる値で埋める
ここでは、同じ sales_df の中で 列の意味に応じて埋め方を変える 例を見ます。 実務ではこの形がいちばん自然になることが多いです。
df = sales_df.copy()
mean_sales = df["売上"].mean()
fill_values = {
"売上": mean_sales,
"カテゴリ": "不明",
"在庫数": 0,
"担当者": "未設定"
}
df = df.fillna(fill_values)
print(df)
| 日付 | 商品 | カテゴリ | 売上 | 在庫数 | 担当者 | 来店者数 | |
|---|---|---|---|---|---|---|---|
| 0 | 2024-04-01 | りんご | 果物 | 1200.0 | 10.0 | 田中 | 25.0 |
| 1 | 2024-04-02 | みかん | 不明 | 1183.333333 | 0.0 | 未設定 | |
| 2 | 2024-04-03 | バナナ | 果物 | 950.0 | 5.0 | 佐藤 | |
| 3 | 2024-04-04 | ぶどう | 不明 | 1183.333333 | 0.0 | 未設定 | 30.0 |
| 4 | 2024-04-05 | もも | 果物 | 1400.0 | 8.0 | 鈴木 | 28.0 |
実行すると、同じ sales_df でも列ごとに違うルールで補完されます。
売上は平均値カテゴリは"不明"在庫数は0担当者は"未設定"
このように、列の意味に応じて補完ルールを分ける のが、実務ではとても大切です。
前の値で埋める
ここでは、日付順に並んだ sales_df の 来店者数 を使って、前の行の値で埋める ffill() を確認します。 ffill() は、時系列や連続観測データで「直前の値を引き継ぐ」考え方を試したいときに使いやすい方法です。
今回の sales_df では、来店者数のように日ごとに連続して観測される列のほうが、ffill() の考え方を自然に理解しやすいです。
df = sales_df.copy().sort_values("日付")
df["来店者数"] = df["来店者数"].ffill()
print(df[["日付", "商品", "来店者数"]])
| 日付 | 商品 | 来店者数 | |
|---|---|---|---|
| 0 | 2024-04-01 | りんご | 25.0 |
| 1 | 2024-04-02 | みかん | 25.0 |
| 2 | 2024-04-03 | バナナ | 25.0 |
| 3 | 2024-04-04 | ぶどう | 30.0 |
| 4 | 2024-04-05 | もも | 28.0 |
迷ったら「列の意味」を先に考える
fillna() の使い方で大切なのは、文法よりもその列が何を表しているかです。
- 数値列なら、0でよいのか、平均値がよいのか
- 文字列列なら、空欄のままにするのか、
"不明"にするのか - 時系列なら、前後の値で補えるのか
この考え方があると、fillna() をただの暗記ではなく、意味を考えて使いやすくなります。
特に機械学習のモデル構築を行う場合、単純な 0 埋めは特徴量の分布を歪めたり、モデルに誤った情報を与えたりする可能性があります。たとえば、欠損値が特定のパターンを持つ場合、それを 0 で埋めるとそのパターンが失われることがあります。 そのため、平均値、中央値、最頻値での補完のほか、欠損値を専用のカテゴリとして扱う、あるいはより高度な補完手法(例: 近傍法、回帰分析)なども検討されることがあります。 まずは fillna() の基本を押さえたうえで、目的に応じて最適な補完方法を選択することが重要です。
実行すると、来店者数 の欠損が直前の行の値で埋まります。 このような処理は、時系列や連続データで「前の値を引き継ぐ」考え方を試したいときに便利です。
ただし、どの列でも前の値で埋めてよいわけではありません。 今回の カテゴリ や 担当者 のような列では、前の値をそのまま入れると意味が変わることがありますし、売上 でも状況によっては不自然になることがあります。
そのため、ffill() は 連続して変化する観測値かどうか を意識して使うことが大切です。
似た機能との違い・使い分け
isnull()で欠損の場所を確認する
fillna() を使う前に、まず どこに欠損があるのか を確認したいことがあります。 ここでも同じ sales_df を使って、欠損位置をチェックします。
df = sales_df.copy()
print(df.isnull())
| 日付 | 商品 | カテゴリ | 売上 | 在庫数 | 担当者 | 来店者数 | |
|---|---|---|---|---|---|---|---|
| 0 | False | False | False | False | False | False | False |
| 1 | False | False | True | True | True | True | True |
| 2 | False | False | False | False | False | False | True |
| 3 | False | False | True | True | True | True | False |
| 4 | False | False | False | False | False | False | False |
実行すると、sales_df のどこが欠損しているかが True / False で表示されます。 たとえば 売上、カテゴリ、在庫数、担当者 に欠損があることが一目で分かります。
fillna() は「埋める」ための機能ですが、その前に どこが欠けているのかを確認する習慣 をつけると、補完ミスを減らしやすくなります。
dropna()との違い
ここでは、同じ sales_df に対して dropna() を使い、fillna() との考え方の違いを確認します。 fillna() は埋める、dropna() は削除する、という違いがあります。
df = sales_df.copy()
print(df.dropna())
| 日付 | 商品 | カテゴリ | 売上 | 在庫数 | 担当者 | 来店者数 | |
|---|---|---|---|---|---|---|---|
| 0 | 2024-04-01 | りんご | 果物 | 1200.0 | 10.0 | 田中 | 25.0 |
| 4 | 2024-04-05 | もも | 果物 | 1400.0 | 8.0 | 鈴木 | 28.0 |
実行すると、欠損を含む行が削除されます。 今回の sales_df では、欠損のない行だけが残るので、データ件数がかなり減ることが分かります。
このように、
- データを残したいなら
fillna() - 欠損のある行を使わないなら
dropna()
という考え方で使い分けると分かりやすいです。
とりあえず0埋めでよいのか?埋め方の考え方
ここでは、同じ sales_df の列を例にしながら、「どの列に0埋めが向くのか」を整理します。
0埋めが向いているケース
たとえば今回のサンプルでは、在庫数 の欠損を「入荷前で未登録」「欠品として扱う」などの前提で 0 にするケースは考えられます。 また、集計上いったん 0 と置いたほうが扱いやすい列もあります。
ただし、これは 列の意味が0と矛盾しない場合だけ です。
0埋めが不自然になりやすいケース
今回の sales_df でいうと、カテゴリ や 担当者 は文字列列なので 0 で埋めるのは不自然です。 また、売上 も「未入力」なのか「本当に0円」なのかで意味が大きく変わります。
このような列に対して機械的に 0 を入れると、後で集計や解釈を誤りやすくなります。
迷ったら「列の意味」を先に考える
今回のサンプルでも、
売上→ 平均値や中央値を検討するカテゴリ→"不明"のような文字列で補完する担当者→"未設定"などで補完する在庫数→ 前提によって0も候補になる
というように、列ごとに自然な埋め方は変わります。
fillna() で大切なのは、「何で埋めるか」だけでなく、その列が何を表しているか を先に考えることです。
エラーや注意点・初心者が迷いやすいポイント
fillna()の結果を代入しないと元のDataFrameが変わらないことがある
ここでも同じ sales_df を使って、「fillna() を書いただけでは元データが変わらない」ケースを確認します。
df = sales_df.copy()
df.fillna(0)
print(df)
| 日付 | 商品 | カテゴリ | 売上 | 在庫数 | 担当者 | 来店者数 | |
|---|---|---|---|---|---|---|---|
| 0 | 2024-04-01 | りんご | 果物 | 1200.0 | 10.0 | 田中 | 25.0 |
| 1 | 2024-04-02 | みかん | |||||
| 2 | 2024-04-03 | バナナ | 果物 | 950.0 | 5.0 | 佐藤 | |
| 3 | 2024-04-04 | ぶどう | 30.0 | ||||
| 4 | 2024-04-05 | もも | 果物 | 1400.0 | 8.0 | 鈴木 | 28.0 |
この場合、fillna() の結果を受け取っていないためです。 売上 や カテゴリ などの欠損は、元の df にそのまま残ります。
df = sales_df.copy()
df = df.fillna(0)
print(df)
| 日付 | 商品 | カテゴリ | 売上 | 在庫数 | 担当者 | 来店者数 | |
|---|---|---|---|---|---|---|---|
| 0 | 2024-04-01 | りんご | 果物 | 1200.0 | 10.0 | 田中 | 25.0 |
| 1 | 2024-04-02 | みかん | 0 | 0.0 | 0.0 | 0 | 0.0 |
| 2 | 2024-04-03 | バナナ | 果物 | 950.0 | 5.0 | 佐藤 | 0.0 |
| 3 | 2024-04-04 | ぶどう | 0 | 0.0 | 0.0 | 0 | 30.0 |
| 4 | 2024-04-05 | もも | 果物 | 1400.0 | 8.0 | 鈴木 | 28.0 |
DataFrame全体をまとめて更新したいときは、このように再代入します。 ただし、今回のサンプルのように文字列列と数値列が混ざっている場合は、一括 0 埋めが不自然になる点には注意が必要です。
または列単位で代入します。
df = sales_df.copy()
df["売上"] = df["売上"].fillna(0)
print(df)
| 日付 | 商品 | カテゴリ | 売上 | 在庫数 | 担当者 | 来店者数 | |
|---|---|---|---|---|---|---|---|
| 0 | 2024-04-01 | りんご | 果物 | 1200.0 | 10.0 | 田中 | 25.0 |
| 1 | 2024-04-02 | みかん | 0.0 | ||||
| 2 | 2024-04-03 | バナナ | 果物 | 950.0 | 5.0 | 佐藤 | |
| 3 | 2024-04-04 | ぶどう | 0.0 | 30.0 | |||
| 4 | 2024-04-05 | もも | 果物 | 1400.0 | 8.0 | 鈴木 | 28.0 |
列の型を確認してから補完する
同じ sales_df でも、売上 や 在庫数 は数値列、カテゴリ や 担当者 は文字列列です。 そのため、補完前に型を確認しておくと「どの列にどの値を入れるか」を判断しやすくなります。
df = sales_df.copy()
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 日付 5 non-null datetime64[ns]
1 商品 5 non-null object
2 カテゴリ 3 non-null object
3 売上 3 non-null float64
4 在庫数 3 non-null float64
5 担当者 3 non-null object
6 来店者数 3 non-null float64
dtypes: datetime64[ns](1), float64(3), object(3)
memory usage: 412.0+ bytes
実行すると、各列のデータ型や欠損の有無が確認できます。 fillna() は便利ですが、列の型と意味を見ながら使う ことが大切です。
DataFrame全体を一括で埋めると不自然になることがある
今回の sales_df のように数値列と文字列列が混在しているDataFrameでは、fillna(0) を全体にかけると説明上は分かりやすくても、実務では不自然になることがあります。 そのため、最終的には 列ごとに埋め方を決める 形を基本に考えると安全です。
大規模データでは処理時間やメモリ使用量も意識する
ここまでのサンプルでは行数が少ないため、fillna() の実行速度やメモリ使用量はほとんど気になりません。 ただし、実務で件数が非常に多いDataFrameを扱う場合は、処理時間やメモリ使用量も意識することがある という点は知っておくと安心です。
そのときに inplace=True を使えば常に高速・省メモリになる、と考えたくなるかもしれません。 しかし、inplace=True を使えば必ず性能がよくなるとは限りません。 実際には、コードの分かりやすさや処理の追いやすさを優先して、df = df.fillna(...) のような再代入の形が選ばれることも多いです。
初心者のうちは、まずは 読みやすくて意図が分かりやすい書き方 を優先すれば十分です。 本当にパフォーマンスが問題になる場面では、実際のデータ件数で処理時間を測りながら判断するとよいでしょう。
初心者がまず覚えるべきfillna()の使い方
ここでは、今回の sales_df を前提に、まず覚えておきたい3つの形を整理します。
特定の列に対して使う
まずは、売上 のような1列だけに対して fillna() を使う形です。 初心者のうちは、この形が最も安全で分かりやすいです。
df = sales_df.copy()
df["売上"] = df["売上"].fillna(0)
print(df[["商品", "売上"]])
| 商品 | 売上 | |
|---|---|---|
| 0 | りんご | 1200.0 |
| 1 | みかん | 0.0 |
| 2 | バナナ | 950.0 |
| 3 | ぶどう | 0.0 |
| 4 | もも | 1400.0 |
まずはこの形が分かりやすいです。
列ごとに値を分ける
次に覚えたいのが、今回の sales_df のように複数の欠損列がある場合に、列ごとに補完方法を分ける形です。
df = sales_df.copy()
mean_sales = df["売上"].mean()
df = df.fillna({
"売上": mean_sales,
"カテゴリ": "不明",
"担当者": "未設定"
})
print(df[["商品", "売上", "カテゴリ", "担当者"]])
| 商品 | 売上 | カテゴリ | 担当者 | |
|---|---|---|---|---|
| 0 | りんご | 1200.0 | 果物 | 田中 |
| 1 | みかん | 1183.333333 | 不明 | 未設定 |
| 2 | バナナ | 950.0 | 果物 | 佐藤 |
| 3 | ぶどう | 1183.333333 | 不明 | 未設定 |
| 4 | もも | 1400.0 | 果物 | 鈴木 |
実際の前処理では、この形がかなり便利です。 「数値列」「カテゴリ列」「担当者のような管理用列」で、埋め方を分けやすいからです。
数値列では平均値も検討する
0 を入れると不自然になりそうな数値列では、今回の 売上 のように平均値で補完する考え方も覚えておくと便利です。
df = sales_df.copy()
mean_sales = df["売上"].mean()
df["売上"] = df["売上"].fillna(mean_sales)
print(df[["商品", "売上"]])
| 商品 | 売上 | |
|---|---|---|
| 0 | りんご | 1200.0 |
| 1 | みかん | 1183.333333 |
| 2 | バナナ | 950.0 |
| 3 | ぶどう | 1183.333333 |
| 4 | もも | 1400.0 |
0 を入れると不自然になりそうな数値列では、この考え方も覚えておくと安心です。 たとえば今回のサンプルでは、売上 を平均値で補完しています。
補完方法の選び方を整理する
ここまで見てきたように、fillna() にはいくつかの補完方法があります。 迷ったときは、列の種類と意味 を基準に選ぶと整理しやすいです。
| 列の例 | 補完方法の候補 | 考え方 |
|---|---|---|
売上 のような数値列 | 平均値 | 外れ値の影響が大きくないときに考えやすい |
売上 のような数値列 | 中央値 | 外れ値の影響を受けにくくしたいとき |
| 数値列でよく出る値がある場合 | 最頻値 | もっとも出現しやすい値でそろえたいとき |
カテゴリ・担当者 のような文字列列 | "不明"・"未設定" | 欠損であることを明示したいとき |
在庫数 のような個数列 | 0 | 「在庫なし」とみなせる場面で使いやすい |
来店者数 のような連続観測データ | ffill() / bfill() | 前後の値を引き継いでも不自然でないとき |
この表のとおり、1つの正解が常にあるわけではありません。 fillna() では、「どの方法が使えるか」よりも「その列にとって自然かどうか」を判断することが大切です。
まとめ
fillna() は、Pandasで欠損値を埋めるための基本機能です。 ただし、今回の sales_df を見ても分かるように、どの列にも同じ値を入れればよいわけではありません。
売上のような数値列カテゴリや担当者のような文字列列在庫数のように0補完も検討しやすい列来店者数のようにffill()を考えやすい連続データ
では、自然な埋め方が違います。
そのため、fillna() では「文法」だけでなく、列の意味に応じて補完方法を選ぶ視点が大切です。 迷ったら、まず isnull() で欠損を確認し、次に「この列は何を表しているか」を考えてから補完方法を決めましょう。
fillna() と dropna() の違いは何ですか?
fillna() は欠損値を別の値で埋める機能です。 一方、dropna() は欠損値を含む行や列を削除する機能です。 行を残したいときは fillna()、不要な行を消してもよいときは dropna() を使いやすいです。
fillna() はとりあえず 0 を入れればよいですか?
必ずしもそうではありません。 数値列によっては、0 を入れると「本当に0だった」という意味に見えてしまうことがあります。 迷ったら、その列の意味を確認して、平均値や中央値での補完も検討するとよいです。
fillna() を使ったのに元のDataFrameが変わりません
fillna() の結果を代入していない可能性があります。 たとえば df = df.fillna(0) のように書くと反映しやすいです。
初心者はまずどの使い方を覚えるべきですか?
まずは次の2つで十分です。df["列名"] = df["列名"].fillna(値)df = df.fillna({"列名": 値})
この2つが分かると、日常的な前処理がかなり進めやすくなります。
平均値・中央値・最頻値は、どれを使えばよいですか?
目安としては、次のように考えると整理しやすいです。
* 平均値: 全体のバランスを見て補完したいとき
* 中央値: 外れ値の影響を抑えたいとき
* 最頻値: よく出る値で埋めたいとき
ただし、最終的には「その列にとって自然かどうか」で判断することが大切です。
コメント