DataFrameからのデータ(行・列)の削除

DataFrameから行ごと、もしくは列ごとデータを削除します。データベースから不要なデータを削除することを想定しています。
今回は以下の関数を紹介していきます。

pandas.DataFrame.drop()
 DataFrameから指定した行、列を削除します。
pandas.DataFrame.dropna()
 欠損値(NaN)が含まれた行、列を削除します。
pandas.DataFrame.drop_duplicates()
 重複のある行を削除します。

まずは今回使用するDataFrameを準備します。

python

import pandas
import numpy

# col4列がすべて欠損値(NaN)となっています
# いくつかの行・列に1つ以上NaNが含まれています
# 2行目、5行目が重複しています
df = pandas.DataFrame([{"col1":1, "col2":"a", "col3":1.2, "col4":numpy.nan},
                      {"col1":2, "col2":"b", "col3":2.3},
                      {"col1":3, "col2":numpy.nan, "col3":3.4},
                      {"col1":3, "col2":"c", "col3":3.4},
                      {"col1":numpy.nan, "col2":numpy.nan, "col3":3.4},
                      {"col1":2, "col2":"b", "col3":2.3},
                      {"col1":4, "col2":"d", "col3":4.5},
                      {"col1":5, "col2":"e", "col3":5.6}])
print(df)

出力

   col1 col2  col3  col4
0   1.0    a   1.2   NaN
1   2.0    b   2.3   NaN
2   3.0  NaN   3.4   NaN
3   3.0    c   3.4   NaN
4   NaN  NaN   3.4   NaN
5   2.0    b   2.3   NaN
6   4.0    d   4.5   NaN
7   5.0    e   5.6   NaN

pandas.DataFrame.dropによる指定した行・列の削除

指定した行・列を削除します。

画像1

以下のような引数を取ります。

・labels
 型: 文字列、リスト
 削除対象の行・列のラベルを指定します。リスト形式で指定することで、複数行・列をまとめて削除することもできます。
・axis
 型: int (0/1のどちらか)
 行方向(0を指定)、列方向(1方向)のどちら方向に削除するかを指定します。デフォルトは0で行方向に削除します。
・index
 型: 文字列、リスト
 削除する行のラベルを指定します。リスト形式で指定することで、複数行をまとめて削除することもできます。
 index=labelは、labels=label, axis=0と同じ意味を持ちます。
・columns
 型: 文字列、リスト
 削除する列のラベルを指定します。リスト形式で指定することで、複数列をまとめて削除することもできます。
 columns=labelは、labels=label, axis=1と同じ意味を持ちます。
・level
 MultiIndexの場合、ラベルが削除されるレベル。
 良く分からないので、またの機会に調べます。今回は使用することはありません。
・inplace
 型: bool
 元のDataFrameを変更するかどうかを指定します。デフォルトはFalseで元のDataFrameは変更せず、戻り値として変更後のDataFrameを返します。Trueを指定すると、元のDataFrameを変更して、戻り値としてNoneを返します。
・errors
 値: 'ignore'、もしくは'raise'
 存在しない行・列を指定した時の動作を指定します。デフォルトは'raise'で例外が発生します。'ignore'を指定すると無視します。


行ラベルを指定して削除します。

python

# 行ラベルを指定して削除, axis=0が省略されています
print(df.drop(labels=2))

出力

   col1 col2  col3  col4
0   1.0    a   1.2   NaN
1   2.0    b   2.3   NaN
3   3.0    c   3.4   NaN
4   NaN  NaN   3.4   NaN
5   2.0    b   2.3   NaN
6   4.0    d   4.5   NaN
7   5.0    e   5.6   NaN


同じく行ラベルを指定して削除します。
使用している引数は違いますが、すぐ上で実行していることと意味は同じです。

python

# df.drop(labels=2, axis=0)と同じ意味
print(df.drop(index=2))

出力

   col1 col2  col3  col4
0   1.0    a   1.2   NaN
1   2.0    b   2.3   NaN
3   3.0    c   3.4   NaN
4   NaN  NaN   3.4   NaN
5   2.0    b   2.3   NaN
6   4.0    d   4.5   NaN
7   5.0    e   5.6   NaN


複数行をまとめて指定して削除します。

python

# 複数行をまとめて削除
print(df.drop(labels=[2, 5], axis=0))

出力

   col1 col2  col3  col4
0   1.0    a   1.2   NaN
1   2.0    b   2.3   NaN
3   3.0    c   3.4   NaN
4   NaN  NaN   3.4   NaN
6   4.0    d   4.5   NaN
7   5.0    e   5.6   NaN


列ラベルを指定して削除します。

python

# 列ラベルを指定して削除
print(df.drop(labels="col3", axis=1))

出力

   col1 col2  col4
0   1.0    a   NaN
1   2.0    b   NaN
2   3.0  NaN   NaN
3   3.0    c   NaN
4   NaN  NaN   NaN
5   2.0    b   NaN
6   4.0    d   NaN
7   5.0    e   NaN


同じく列ラベルを指定して削除します。 使用している引数は違いますが、すぐ上で実行していることと意味は同じです。

python

# columns指定した列を削除
# df.drop(labels="col3", axis=1)と同じ意味
print(df.drop(columns="col3"))

出力

   col1 col2  col4
0   1.0    a   NaN
1   2.0    b   NaN
2   3.0  NaN   NaN
3   3.0    c   NaN
4   NaN  NaN   NaN
5   2.0    b   NaN
6   4.0    d   NaN
7   5.0    e   NaN


複数列をまとめて指定して削除します。

python

# 複数列をまとめて削除
print(df.drop(labels=["col2", "col4"], axis=1))

出力

   col1  col3
0   1.0   1.2
1   2.0   2.3
2   3.0   3.4
3   3.0   3.4
4   NaN   3.4
5   2.0   2.3
6   4.0   4.5
7   5.0   5.6


行・列まとめて指定して削除します。

python

# 行・列同時に複数指定して削除することもできる
print(df.drop(index=[2, 5], columns=["col2", "col4"]))

出力

   col1  col3
0   1.0   1.2
1   2.0   2.3
3   3.0   3.4
4   NaN   3.4
6   4.0   4.5
7   5.0   5.6


元データを変更します。

python

# inplace=Trueとすると、元データを変更して、戻り値がNoneになる。
copy_df = df.copy()
print(copy_df)
print()
print("メソッドの戻り値:", copy_df.drop(index=[2, 5], columns=["col2", "col4"], inplace=True))
print()
print(copy_df)

出力

   col1 col2  col3  col4
0   1.0    a   1.2   NaN
1   2.0    b   2.3   NaN
2   3.0  NaN   3.4   NaN
3   3.0    c   3.4   NaN
4   NaN  NaN   3.4   NaN
5   2.0    b   2.3   NaN
6   4.0    d   4.5   NaN
7   5.0    e   5.6   NaN

メソッドの戻り値: None

  col1  col3
0   1.0   1.2
1   2.0   2.3
3   3.0   3.4
4   NaN   3.4
6   4.0   4.5
7   5.0   5.6

pandas.DataFrame.dropnaによる欠損値(NaN)が含まれた行・列の削除

欠損値(NaN)を含む行・列を削除します。

画像2

以下のような引数を取ります。

・axis
 値: 0もしくは1、'index'もしくは'columns'
 行方向に削除するか、列方向に削除するかを指定します。デフォルトはaxis=0で、行方向に削除します。
・how
 値: 'any'、もしくは'all'
 欠損値が1つでもあれば削除するのか、全て欠損値のときに削除するのかを指定します。デフォルトは'any'で1つでも欠損値があれば削除します。
・thresh
 型: int
 オプション引数です。欠損値でない値がいくつ残っていれば削除しないかを指定します。
・subset
 型: リスト
 オプション引数です。削除する対象の行・列のラベルを指定します。指定されたラベルの中で、欠損値を含む行・列の削除を行います。
・inplace
 型: bool
 元のDataFrameを変更するかどうかを指定します。デフォルトはFalseで元のDataFrameは変更せず、戻り値として変更後のDataFrameを返します。Trueを指定すると、元のDataFrameを変更して、戻り値としてNoneを返します。


行方向に削除します。

python

# axis=0が省略されています。
# "col4"列が全て欠損値なので、行方向にすべての行が削除されます。
print(df.dropna())

出力

Empty DataFrame
Columns: [col1, col2, col3, col4]
Index: []


列方向に削除します。

python

# "col3"列だけが残って、それ以外は欠損値を含むので削除されます。
print(df.dropna(axis=1))

出力

   col3
0   1.2
1   2.3
2   3.4
3   3.4
4   3.4
5   2.3
6   4.5
7   5.6


全て欠損値である列を削除します。

python

# 列方向に全て欠損値を含む列が削除されます。
print(df.dropna(axis=1, how="all"))

出力

   col1 col2  col3
0   1.0    a   1.2
1   2.0    b   2.3
2   3.0  NaN   3.4
3   3.0    c   3.4
4   NaN  NaN   3.4
5   2.0    b   2.3
6   4.0    d   4.5
7   5.0    e   5.6


欠損値でない値が複数以上残っている行を残して、削除します。

python

# 欠損値でない値が2つ以上残っている行が残ります。
print(df.dropna(thresh=2))

出力

   col1 col2  col3  col4
0   1.0    a   1.2   NaN
1   2.0    b   2.3   NaN
2   3.0  NaN   3.4   NaN
3   3.0    c   3.4   NaN
5   2.0    b   2.3   NaN
6   4.0    d   4.5   NaN
7   5.0    e   5.6   NaN


元のデータを変更します。

python

# 元のデータを変更します。
copy_df = df.copy()
print(copy_df)
print()
print("メソッドの戻り値:", copy_df.dropna(axis=1, how="all", inplace=True))
print()
print(copy_df)

出力

   col1 col2  col3  col4
0   1.0    a   1.2   NaN
1   2.0    b   2.3   NaN
2   3.0  NaN   3.4   NaN
3   3.0    c   3.4   NaN
4   NaN  NaN   3.4   NaN
5   2.0    b   2.3   NaN
6   4.0    d   4.5   NaN
7   5.0    e   5.6   NaN

メソッドの戻り値: None

  col1 col2  col3
0   1.0    a   1.2
1   2.0    b   2.3
2   3.0  NaN   3.4
3   3.0    c   3.4
4   NaN  NaN   3.4
5   2.0    b   2.3
6   4.0    d   4.5
7   5.0    e   5.6

pandas.DataFrame.drop_duplicatesによる重複のある行の削除

重複した行を削除します。

画像3

以下のような引数を取ります。

・subset
 型: リスト
 オプション引数です。削除する対象の行ラベルを指定します。指定されたラベルの中で、重複を含む行の削除を行います。
・keep
 値: 'first', 'last', False
 重複した行があったときに、どの行を残すかを指定します。
 デフォルトは'first'で最初の行を残します。'last'は最後の行を残します。Falseを指定すると、重複のある行を全て削除します。
・inplace
 型: bool
 元のDataFrameを変更するかどうかを指定します。デフォルトはFalseで元のDataFrameは変更せず、戻り値として変更後のDataFrameを返します。Trueを指定すると、元のDataFrameを変更して、戻り値としてNoneを返します。
・ignore_index
 型: bool
 indexを振りなおすかどうかを指定します。デフォルトはFalseでindexはそのままです。Trueにすると0からの連番でindexを振りなおします。

重複のある行を削除します。

python

# 行1と行5が重複しています。
# デフォルトでkeep='first'となっているので、行5が削除されます。
print(df)
print()
print(df.drop_duplicates())

出力

   col1 col2  col3  col4
0   1.0    a   1.2   NaN
1   2.0    b   2.3   NaN
2   3.0  NaN   3.4   NaN
3   3.0    c   3.4   NaN
4   NaN  NaN   3.4   NaN
5   2.0    b   2.3   NaN
6   4.0    d   4.5   NaN
7   5.0    e   5.6   NaN

  col1 col2  col3  col4
0   1.0    a   1.2   NaN
1   2.0    b   2.3   NaN
2   3.0  NaN   3.4   NaN
3   3.0    c   3.4   NaN
4   NaN  NaN   3.4   NaN
6   4.0    d   4.5   NaN
7   5.0    e   5.6   NaN


元のデータを変更し、かつindexを振りなおします。

python

# 元データを変更して、indexを振りなおします。
copy_df = df.copy()
print(copy_df)
print()
print("メソッドの戻り値:", copy_df.drop_duplicates(inplace=True, ignore_index=True))
print()
print(copy_df)

出力

   col1 col2  col3  col4
0   1.0    a   1.2   NaN
1   2.0    b   2.3   NaN
2   3.0  NaN   3.4   NaN
3   3.0    c   3.4   NaN
4   NaN  NaN   3.4   NaN
5   2.0    b   2.3   NaN
6   4.0    d   4.5   NaN
7   5.0    e   5.6   NaN

メソッドの戻り値: None

  col1 col2  col3  col4
0   1.0    a   1.2   NaN
1   2.0    b   2.3   NaN
2   3.0  NaN   3.4   NaN
3   3.0    c   3.4   NaN
4   NaN  NaN   3.4   NaN
5   4.0    d   4.5   NaN
6   5.0    e   5.6   NaN

まとめ

今回はDataFrameからデータを削除する方法をまとめました。

・行・列を指定して削除するときは、dropメソッドを使います。
・欠損値(NaN)を含む行・列を削除するときは、dropnaメソッドを使います。
・重複のある行を削除するときは、drop_duplicatesメソッドを使います。

この記事が気に入ったらサポートをしてみませんか?