Python

pandasのDataFrameでNoneを含むをデータを除く方法

Pythonで表形式のデータを扱うのに便利なpandas。

データを扱っていると中には欠損値 None を含むデータもある。

しかし場合によっては特定のカラムに None を含むデータを除外したいこともあるだろう。

ではどうやって None を除外すれば良いのか。

そこで今回はpandasのDataFrameでNoneを含むをデータを除く方法について紹介する。

この記事を書いている人


システムエンジニア、AIエンジニアと、IT業界で10年以上働いている中堅。PythonとSQLが得意。

記事を読むメリット

pandasのDataFrameでNoneを含むをデータを除く方法がわかる


pandasでNoneを含むをデータを除く方法

pandasでNoneを含むをデータを除くには dropna() を用いる。

dropna() は名前の通り、欠損値 None を含むデータを削除(drop)する為の機能。

使い方としては以下のように用いる。

import pandas as pd

data_list1 = [
[1,2,None],
[2,None,4],
[None,4,5],
[4,5,6]
]
col_list1 = ["c1","c2","c3"]
df1 = pd.DataFrame(data=data_list1, columns=col_list1)
print(df1)

#     c1   c2   c3
# 0  1.0  2.0  NaN
# 1  2.0  NaN  4.0
# 2  NaN  4.0  5.0
# 3  4.0  5.0  6.0

df2 = df1.dropna()

print(df2)

#     c1   c2   c3
# 3  4.0  5.0  6.0


dropna() をすることで None を持たない行だけが抽出された。

では特殊な条件を指定するにはどうしたらいいだろうか。



特定のカラムにNoneを含むをデータを除く方法

dropna() をすることでデータのどこか1つのカラムに None を持つ行を削除して、欠損の無い行だけ抽出できた。

では None の有無チェックを特定のカラムのみにするにはどうすればいいのか。

カラムを指定する場合は subset を用いる。

subsetにNoneチェックしたいカラム名をリスト形式で指定すると以下のようになる。

df3 = df1.dropna(subset=["c1","c2"])
print(df3)

#     c1   c2   c3
# 0  1.0  2.0  NaN
# 3  4.0  5.0  6.0



全ての値がNoneの行のみ削除する方法

ではどれか1つのカラムに、ではなく全てのカラムにNoneを持つ行のみ削除するにはどうしたらよいのか。

その場合は how="all" を指定する。

how="all" を指定すると全ての値がNoneの行のみ除外されたDataFrameが得られる。

data_list1 = [
[1,2,None],
[2,None,4],
[None,None,None],
[4,5,6]
]

col_list1 = ["c1","c2","c3"]
df1 = pd.DataFrame(data=data_list1, columns=col_list1)
print(df1)

#     c1   c2   c3
# 0  1.0  2.0  NaN
# 1  2.0  NaN  4.0
# 2  NaN  NaN  NaN
# 3  4.0  5.0  6.0

df2 = df1.dropna()
print(df2)

#     c1   c2   c3
# 3  4.0  5.0  6.0

df4 = df1.dropna(how="all")
print(df4)

#     c1   c2   c3
# 0  1.0  2.0  NaN
# 1  2.0  NaN  4.0
# 3  4.0  5.0  6.0



Noneを含む列を除外する方法

これまでは dropna() でNoneを含む行を除外してきた。

では行ではなく列(カラム)を除外するにはどうしたらいいのか。

列(カラム)の除外には axis=1 を指定する。

data_list1 = [
[1,2,None],
[2,None,4],
[3,4,5],
[4,5,6]
]
col_list1 = ["c1","c2","c3"]
df1 = pd.DataFrame(data=data_list1, columns=col_list1)
print(df1)

#     c1   c2   c3
# 0  1.0  2.0  NaN
# 1  2.0  NaN  4.0
# 2  3.0  4.0  5.0
# 3  4.0  5.0  6.0

df5 = df1.dropna(axis=1)
print(df5)

#    c1
# 0   1
# 1   2
# 2   3
# 3   4


axis=1 を指定することでNoneを含む列が除外された。



 まとめ

今回はpandasのDataFrameでNoneを含むをデータを除く方法について紹介した。

Noneを含むをデータを除くには dropna() を用いる。

そして除外の方法を変えるには以下のようにパラメータを指定する。

Noneを除外する方法

  • カラム指定するには subset=["カラム名"]
  • 全部の列がNoneの行のみ削除するには how="all"
  • 行ではなく列を除外するには axis=1


  • ちょくちょく使うので覚えておきたいですね



    今回のようなPythonを使ったスクリプト。

    一度きりの計算であれば手元で処理を実行すればよいが、もし定期的に処理を実行しようと思うと開発マシンとは別に実行環境を用意する必要がある。

    クラウド環境を使う方法もあるが、安価な小型マシンを用意するとランニングコストが抑えられるので検討すると良いかも知れない。

    役に立ったらシェアしてくれると励みになります。

    にほんブログ村 IT技術ブログへ

    -Python
    -

    Translate »

    © 2021 ITips