DataFrameで欠損値のある行・列を削除する

pandas.DataFrameのデータをグラフ化するときに欠損値があると困りますよね。この記事では欠損値のある行や列を削除する方法をご紹介します。

欠損値削除には関数dropna()を使います。
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.dropna.html

欠損値のある行を削除する

元データはIndexが”X, Y, Z”で、カラムが”A, B, C”の3行3列のDataFrameとします。欠損値のpd.NAをデータに複数入れ込みます。

まずは、関数dropnaを使い、引数axisに”index”指定をして欠損値のある行を削除します。結果は”X”の行だけが残りました。

# DataFrameのデータを作成する。
df = pd.DataFrame(
    data=[[0, 1, 2], [3, pd.NA, 5], [6, 7, pd.NA]],
    index=['X', 'Y', 'Z'],
    columns=['A', 'B', 'C'],
    )

print(df)
#    A     B     C
# X  0     1     2
# Y  3  <NA>     5
# Z  6     7  <NA>


# 欠損値のある行を削除する。
df_r = df.dropna(axis='index')

print(df_r)
#    A  B  C
# X  0  1  2

欠損値のある列を削除する

関数dropnaを使い、引数axisに”columns”指定をして欠損値のある列を削除します。結果は”A”の列だけが残りました。

# DataFrameのデータを作成する。
df = pd.DataFrame(
    data=[[0, 1, 2], [3, pd.NA, 5], [6, 7, pd.NA]],
    index=['X', 'Y', 'Z'],
    columns=['A', 'B', 'C'],
    )

print(df)
#    A     B     C
# X  0     1     2
# Y  3  <NA>     5
# Z  6     7  <NA>


# 欠損値のある列を削除する。
df_c = df.dropna(axis='columns')

print(df_c)
#    A
# X  0
# Y  3
# Z  6

残念ながら、欠損値のある行と列を一度に削除するようなaxis=’both’みたいなことはできません

指定した列に限定して、欠損値のある行を削除する

カラムが複数ある場合に、指定した列の欠損値のみに注目して行を削除する方法です。引数subsetを使います。

例えば、C列に欠損値を含む行を削除したい場合は、引数subsetに”C”を入れます。subsetはリストで設定するので、複数のカラムを指定することができます。

# DataFrameのデータを作成する。
df = pd.DataFrame(
    data=[[0, 1, 2], [3, 4, pd.NA], [6, pd.NA, 8]],
    index=['X', 'Y', 'Z'],
    columns=['A', 'B', 'C'],
    )

print(df)
#    A     B     C
# X  0     1     2
# Y  3     4  <NA>
# Z  6  <NA>     8


# C列に欠損値がある行を削除する。
df_r = df.dropna(axis='index', subset=['C'])

print(df_r)
#    A     B  C
# X  0     1  2
# Z  6  <NA>  8


# B列とC列に欠損値がある行を削除する。
df_r = df.dropna(axis='index', subset=['B', 'C'])

print(df_r)
#    A  B  C
# X  0  1  2

指定した行に限定して、欠損値のある列を削除する

次は、ある行に注目して、ある行に欠損値がある列を削除する例です。Z行に欠損値があるB列を削除しています。

# DataFrameのデータを作成する。
df = pd.DataFrame(
    data=[[0, 1, 2], [3, 4, pd.NA], [6, pd.NA, 8]],
    index=['X', 'Y', 'Z'],
    columns=['A', 'B', 'C'],
    )

print(df)
#    A     B     C
# X  0     1     2
# Y  3     4  <NA>
# Z  6  <NA>     8


# Z行に欠損値がある列を削除する。
df_c = df.dropna(axis='columns', subset=['Z'])

print(df_c)
#    A     C
# X  0     2
# Y  3  <NA>
# Z  6     8