Pandas df.dropna() 関数
df.dropna()Pandas で欠損値を含む行または列を削除するための関数です。
データ分析において、欠損値(NaN、None 或 NULL)はよくある問題です。dropna()この関数はデータをクリーニングする簡単な方法を提供します。欠損値を含む行・列を削除したり、欠損値の割合に基づいてデータをフィルタリングしたりできます。
基本構文とパラメータ
dropna()DataFrame のメンバー関数であり、ドット演算子によって.呼び出されます。
構文形式
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
パラメータの説明
| パラメータ | 型 | 必須かどうか | 説明 | デフォルト値 |
|---|---|---|---|---|
| axis | int または str | 任意 | 行と列のどちらを削除するかを指定します。0 或 'index'欠損値を含む行を削除することを示します;1 或 'columns'欠損値を含む列を削除することを示します。 |
0 |
| how | str | 任意 | 削除条件を指定します。'any'欠損値があれば削除することを示します;'all'全てが欠損値の場合のみ削除することを示します。 |
'any' |
| thresh | int | 任意 | 非欠損値の最小数を設定します。行(または列)内の非欠損値の数がthresh未満の場合は、その行(または列)を削除します。 |
None |
| subset | array-like | 任意 | どの列(または行)で欠損値を検査するかを指定します。もしaxis=0、その場合はsubset列名を指定します。もしaxis=1、その場合はsubset行インデックスを指定します。 |
None |
| inplace | bool | 任意 | もしTrueの場合、元の DataFrame 上で直接変更し、新しいオブジェクトを返しません。もしFalseの場合、新しい DataFrame を返し、元のデータは変わりません。 |
False |
戻り値の説明
- 新しい DataFrame を返します(もし
inplace=Falseの場合)、またはNone(もしinplace=True)。 - 返される DataFrame には欠損値を含む行または列は含まれません。
実例
一連の例を通して、徹底的にdropna()の使い方をマスターしましょう。
例1:欠損値を含む行を削除する
これは最も一般的な使い方で、欠損値を含む行を削除します。
実例
import pandas as pd
import numpy as np
# 欠損値を含む DataFrame を作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'年龄': [25, 30, np.nan, 35, 28], # 王五の年齢が欠損
'薪资': [5000, 6000, 5500, np.nan, 7000], # 趙六の給与が欠損
'部门': ['技术', '市场', '技术', '市场', '技术']
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print("=" * 50)
# 欠損値を含む行を削除(デフォルトの動作)
df_cleaned = df.dropna()
print("欠損値削除後のデータ:")
print(df_cleaned)
import numpy as np
# 欠損値を含む DataFrame を作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'年龄': [25, 30, np.nan, 35, 28], # 王五の年齢が欠損
'薪资': [5000, 6000, 5500, np.nan, 7000], # 趙六の給与が欠損
'部门': ['技术', '市场', '技术', '市场', '技术']
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print("=" * 50)
# 欠損値を含む行を削除(デフォルトの動作)
df_cleaned = df.dropna()
print("欠損値削除後のデータ:")
print(df_cleaned)
実行結果の予想:
原始数据:
姓名 年龄 薪资 部门
0 张三 25.0 5000.0 技术
1 李四 30.0 6000.0 市场
2 王五 NaN 5500.0 技术
3 赵六 35.0 NaN 市场
4 钱七 28.0 7000.0 技术
==================================================
删除缺失值后的数据:
姓名 年龄 薪资 部门
0 张三 25.0 5000.0 技术
1 李四 30.0 6000.0 市场
4 钱七 28.0 7000.0 技术
コードの解説:
- 欠損値を含む DataFrame を作成しました。王五の年齢は
NaN、趙六の給与はNaN。 - を使用して
df.dropna()デフォルトのパラメータで、欠損値を含むすべての行を削除しました。 - 結果として張三、李四、銭七のデータが残り、王五と趙六が削除されました。
例2:欠損値を含む列を削除する
どの列に欠損値があるかを重視する場合は、列を削除する選択もできます。
実例
import pandas as pd
import numpy as np
# 欠損値を含む DataFrame を作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 35, 40],
'薪资': [5000, np.nan, 5500, np.nan], # 複数の列に欠損値がある
'部门': [np.nan, '市场', '技术', '市场'],
'城市': ['北京', '上海', '广州', '深圳'] # 欠損値なし
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print("=" * 50)
# 欠損値を含む列を削除する
df_cleaned = df.dropna(axis=1)
print("欠損値の列を削除した後のデータ:")
print(df_cleaned)
import numpy as np
# 欠損値を含む DataFrame を作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 35, 40],
'薪资': [5000, np.nan, 5500, np.nan], # 複数の列に欠損値がある
'部门': [np.nan, '市场', '技术', '市场'],
'城市': ['北京', '上海', '广州', '深圳'] # 欠損値なし
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print("=" * 50)
# 欠損値を含む列を削除する
df_cleaned = df.dropna(axis=1)
print("欠損値の列を削除した後のデータ:")
print(df_cleaned)
実行結果の予想:
原始数据:
姓名 年龄 薪资 部门 城市
0 张三 25 5000.0 NaN 北京
1 李四 30 NaN 市场 上海
2 王五 35 5500.0 技术 广州
3 赵六 40 NaN 市场 深圳
==================================================
删除缺失值列后的数据:
姓名 年龄 城市
0 张三 25 北京
1 李四 30 上海
2 王五 35 广州
3 赵六 40 深圳
コードの解説:
- 設定
axis=1列単位で操作することを示します。 - 給与(薪资)と部門(部门)の列には欠損値が含まれるため、削除されました。
- 姓名、年齢、都市の列には欠損値がないため、残りました。
例3:thresh パラメータを使用して削除条件を制御する
threshこのパラメータを使うと、非欠損値の最小数を設定できます。行(または列)内の非欠損値の数がこのしきい値を下回る場合にのみ削除されます。
実例
import pandas as pd
import numpy as np
# 各行に欠損値がある DataFrame を作成する
data = {
'A': [1, 2, np.nan, 4, 5],
'B': [np.nan, 2, 3, 4, np.nan], # 欠損値が2つ
'C': [1, 2, 3, 4, 5], # 欠損値なし
'D': [np.nan, np.nan, np.nan, 4, 5] # 欠損値が3つ
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print("=" * 50)
# 非欠損値が少なくとも3つある行のみを残す
df_cleaned = df.dropna(thresh=3)
print("非欠損値が3つ以上の行を残す:")
print(df_cleaned)
import numpy as np
# 各行に欠損値がある DataFrame を作成する
data = {
'A': [1, 2, np.nan, 4, 5],
'B': [np.nan, 2, 3, 4, np.nan], # 欠損値が2つ
'C': [1, 2, 3, 4, 5], # 欠損値なし
'D': [np.nan, np.nan, np.nan, 4, 5] # 欠損値が3つ
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print("=" * 50)
# 非欠損値が少なくとも3つある行のみを残す
df_cleaned = df.dropna(thresh=3)
print("非欠損値が3つ以上の行を残す:")
print(df_cleaned)
実行結果の予想:
原始数据:
A B C D
0 1.0 NaN 1.0 NaN
1 2.0 2.0 2.0 NaN
2 NaN 3.0 3.0 NaN
3 4.0 4.0 4.0 4.0
4 5.0 NaN 5.0 5.0
==================================================
保留至少3个非缺失值的行:
A B C D
1 2.0 2.0 2.0 NaN
3 4.0 4.0 4.0 4.0
コードの解説:
- 0行目は非欠損値が1つ(1.0)しかないため、削除されました。
- 1行目は非欠損値が3つ(2.0, 2.0, 2.0)あるため、残りました。
- 2行目は非欠損値が2つ(3.0, 3.0)しかないため、削除されました。
- 3行目は非欠損値が4つあるため、残りました。
- 4行目は非欠損値が3つ(5.0, 5.0, 5.0)あるため、残りました。
例4:subset を使用して検査する列を指定する
特定の列に欠損値があるかどうかだけを気にする場合は、subsetパラメータを使用できます。
実例
import pandas as pd
import numpy as np
# DataFrame を作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, np.nan, 35, 40], # 李四の年齢が欠損
'薪资': [5000, 6000, np.nan, 8000], # 王五の給与が欠損
'部门': ['技术', '市场', '技术', '市场']
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print("=" * 50)
# "姓名"と"部门"の列のみで欠損値を検査する
df_cleaned = df.dropna(subset=['姓名', '部门'])
print("姓名と部門の列だけで欠損値を検査した後のデータ:")
print(df_cleaned)
print("=" * 50)
# "薪资"の列のみで欠損値を検査する
df_cleaned2 = df.dropna(subset=['薪资'])
print("給与の列だけで欠損値を検査した後のデータ:")
print(df_cleaned2)
import numpy as np
# DataFrame を作成する
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, np.nan, 35, 40], # 李四の年齢が欠損
'薪资': [5000, 6000, np.nan, 8000], # 王五の給与が欠損
'部门': ['技术', '市场', '技术', '市场']
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print("=" * 50)
# "姓名"と"部门"の列のみで欠損値を検査する
df_cleaned = df.dropna(subset=['姓名', '部门'])
print("姓名と部門の列だけで欠損値を検査した後のデータ:")
print(df_cleaned)
print("=" * 50)
# "薪资"の列のみで欠損値を検査する
df_cleaned2 = df.dropna(subset=['薪资'])
print("給与の列だけで欠損値を検査した後のデータ:")
print(df_cleaned2)
実行結果の予想:
原始数据:
姓名 年龄 薪资 部门
0 张三 25.0 5000.0 技术
1 李四 NaN 6000.0 市场
2 王五 35.0 NaN 技术
3 赵六 40.0 8000.0 市场
==================================================
只在姓名和部门列检查缺失值后的数据:
姓名 年龄 薪资 部门
0 张三 25.0 5000.0 技术
1 李四 NaN 6000.0 市场
2 王五 35.0 NaN 技术
3 赵六 40.0 8000.0 市场
==================================================
只在薪资列检查缺失值后的数据:
姓名 年龄 薪资 部门
0 张三 25.0 5000.0 技术
1 李四 30.0 6000.0 市场
3 赵六 40.0 8000.0 市场
コードの解説:
- 姓名と部門の列には欠損値がないため、検査後もすべての行が残ります。
- 給与の列では王五の給与が
NaNであるため、2行目が削除されました。
例5:how='all' を使用して全てが欠損値の行のみを削除する
how='all'このパラメータは、行(または列)内のすべての値が欠損値である場合のみ削除することを示します。
実例
import pandas as pd
import numpy as np
# すべての値が欠損値の行をいくつか含む DataFrame を作成する
data = {
'A': [1, np.nan, np.nan, 4],
'B': [2, np.nan, np.nan, 5],
'C': [3, np.nan, np.nan, 6]
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print("=" * 50)
# すべての値が欠損値の行を削除する
df_cleaned = df.dropna(how='all')
print("すべての値が欠損値の行を削除した後:")
print(df_cleaned)
import numpy as np
# すべての値が欠損値の行をいくつか含む DataFrame を作成する
data = {
'A': [1, np.nan, np.nan, 4],
'B': [2, np.nan, np.nan, 5],
'C': [3, np.nan, np.nan, 6]
}
df = pd.DataFrame(data)
print("元のデータ:")
print(df)
print("=" * 50)
# すべての値が欠損値の行を削除する
df_cleaned = df.dropna(how='all')
print("すべての値が欠損値の行を削除した後:")
print(df_cleaned)
実行結果の予想:
原始数据:
A B C
0 1.0 2.0 3.0
1 NaN NaN NaN
2 NaN NaN NaN
3 4.0 5.0 6.0
==================================================
删除全部为缺失值的行后:
A B C
0 1.0 2.0 3.0
3 4.0 5.0 6.0
コードの解説:
- 1行目と2行目のすべての値は
NaNであり、使用してhow='all'それらを削除しました。 - 0行目と3行目には実際のデータがあるため、保持されました。
注意事項
dropna()デフォルトでは元の DataFrame は変更されません。その場で変更したい場合は、inplace=Trueパラメータを使用します。- 使用
threshパラメータを使用する場合、設定する値はデータ品質に対する要件に基づく必要があります。 - データを削除する前に、まず次を使用することをお勧めします
df.isnull().sum()各列の欠損値の数を確認し、より賢明な判断を下すこと。 - 重要なデータセットについては、慎重に使用してください
dropna()。これは大量のデータが失われる可能性があるため、次の使用を検討できますfillna()を使用して欠損値を埋めることができます。
その他の拡張
Pandas でよく使われる関数