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