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による指定した行・列の削除
指定した行・列を削除します。
以下のような引数を取ります。
・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)を含む行・列を削除します。
以下のような引数を取ります。
・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による重複のある行の削除
重複した行を削除します。
以下のような引数を取ります。
・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メソッドを使います。
この記事が気に入ったらサポートをしてみませんか?