pandas.DataFrameの行・列を指定して削除するdrop
pandas.DataFrameの行・列を指定して削除するにはdrop()メソッドを使う。
欠損値NaNの削除や要素が重複した行の削除については以下の記事を参照。
本記事のサンプルコードのpandasのバージョンは以下の通り。バージョンによって仕様が異なる可能性があるので注意。以下のpandas.DataFrameを例として使う。
import pandas as pd
print(pd.__version__)
# 2.0.3
df = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
print(df)
# age state point
# name
# Alice 24 NY 64
# Bob 42 CA 92
# Charlie 18 CA 70
# Dave 68 TX 70
# Ellen 24 CA 88
# Frank 30 NY 57
DataFrameの行を指定して削除
行名(行ラベル)で指定
第一引数labelsに行名を指定し、第二引数axisを0とする。デフォルトがaxis=0なので、axisは省略可能。
print(df.drop('Charlie', axis=0))
# age state point
# name
# Alice 24 NY 64
# Bob 42 CA 92
# Dave 68 TX 70
# Ellen 24 CA 88
# Frank 30 NY 57
print(df.drop('Charlie'))
# age state point
# name
# Alice 24 NY 64
# Bob 42 CA 92
# Dave 68 TX 70
# Ellen 24 CA 88
# Frank 30 NY 57
バージョン0.21.0以降は引数indexで指定することもできる。
print(df.drop(index='Charlie'))
# age state point
# name
# Alice 24 NY 64
# Bob 42 CA 92
# Dave 68 TX 70
# Ellen 24 CA 88
# Frank 30 NY 57
複数の行をまとめて削除する場合はリストで指定する。
print(df.drop(['Bob', 'Dave', 'Frank']))
# age state point
# name
# Alice 24 NY 64
# Charlie 18 CA 70
# Ellen 24 CA 88
print(df.drop(index=['Bob', 'Dave', 'Frank']))
# age state point
# name
# Alice 24 NY 64
# Charlie 18 CA 70
# Ellen 24 CA 88
デフォルトでは元のDataFrameは変更されず、新しいDataFrameが返される。引数inplaceをTrueにすると元のDataFrameが変更される。この場合、新しいDataFrameは返されず、返り値はNone。
df_copy = df.copy()
df_copy.drop(index=['Bob', 'Dave', 'Frank'], inplace=True)
print(df_copy)
# age state point
# name
# Alice 24 NY 64
# Charlie 18 CA 70
# Ellen 24 CA 88
行番号で指定
行番号で指定したい場合はDataFrameのindex属性を利用する。
index属性の[]に行番号を指定すると対応する行名が取得できる。複数の行番号をリストで指定可能。
print(df.index[[1, 3, 5]])
# Index(['Bob', 'Dave', 'Frank'], dtype='object', name='name')
これをdrop()の第一引数labelsやindexに指定すればよい。
print(df.drop(df.index[[1, 3, 5]]))
# age state point
# name
# Alice 24 NY 64
# Charlie 18 CA 70
# Ellen 24 CA 88
print(df.drop(index=df.index[[1, 3, 5]]))
# age state point
# name
# Alice 24 NY 64
# Charlie 18 CA 70
# Ellen 24 CA 88
行名が設定されていない場合の注意点
行名が設定されていない場合、indexはデフォルトで整数値の連番となる。このように、文字列ではなく数値がindexとなっている場合は注意が必要。
df_noindex = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df_noindex)
# name age state point
# 0 Alice 24 NY 64
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 3 Dave 68 TX 70
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
print(df_noindex.index)
# RangeIndex(start=0, stop=6, step=1)
連番のままであれば、数値をそのまま指定してもindex属性を利用して指定しても結果は同じ。
print(df_noindex.drop([1, 3, 5]))
# name age state point
# 0 Alice 24 NY 64
# 2 Charlie 18 CA 70
# 4 Ellen 24 CA 88
print(df_noindex.drop(df_noindex.index[[1, 3, 5]]))
# name age state point
# 0 Alice 24 NY 64
# 2 Charlie 18 CA 70
# 4 Ellen 24 CA 88
ソートなどで連番でなくなると結果が異なる。数値をそのまま指定する場合は行ラベルがその数値である行が削除され、index属性を利用する場合は行番号がその数値である行が削除される。
df_noindex_sort = df_noindex.sort_values('state')
print(df_noindex_sort)
# name age state point
# 1 Bob 42 CA 92
# 2 Charlie 18 CA 70
# 4 Ellen 24 CA 88
# 0 Alice 24 NY 64
# 5 Frank 30 NY 57
# 3 Dave 68 TX 70
print(df_noindex_sort.index)
# Index([1, 2, 4, 0, 5, 3], dtype='int64')
print(df_noindex_sort.drop([1, 3, 5]))
# name age state point
# 2 Charlie 18 CA 70
# 4 Ellen 24 CA 88
# 0 Alice 24 NY 64
print(df_noindex_sort.drop(df_noindex_sort.index[[1, 3, 5]]))
# name age state point
# 1 Bob 42 CA 92
# 4 Ellen 24 CA 88
# 5 Frank 30 NY 57
DataFrameの列を指定して削除
列名(列ラベル)で指定
第一引数labelsに列名を指定し、第二引数axisを1とする。
print(df.drop('state', axis=1))
# age point
# name
# Alice 24 64
# Bob 42 92
# Charlie 18 70
# Dave 68 70
# Ellen 24 88
# Frank 30 57
バージョン0.21.0以降は引数columnsで指定することもできる。
print(df.drop(columns='state'))
# age point
# name
# Alice 24 64
# Bob 42 92
# Charlie 18 70
# Dave 68 70
# Ellen 24 88
# Frank 30 57
複数の列をまとめて削除する場合はリストで指定する。
print(df.drop(['state', 'point'], axis=1))
# age
# name
# Alice 24
# Bob 42
# Charlie 18
# Dave 68
# Ellen 24
# Frank 30
print(df.drop(columns=['state', 'point']))
# age
# name
# Alice 24
# Bob 42
# Charlie 18
# Dave 68
# Ellen 24
# Frank 30
行の場合と同様に、引数inplaceをTrueにすると元のDataFrameが変更される。
df_copy = df.copy()
df_copy.drop(columns=['state', 'point'], inplace=True)
print(df_copy)
# age
# name
# Alice 24
# Bob 42
# Charlie 18
# Dave 68
# Ellen 24
# Frank 30
列番号で指定
列番号で指定したい場合はDataFrameのcolumns属性を利用する。
print(df.columns[[1, 2]])
# Index(['state', 'point'], dtype='object')
print(df.drop(df.columns[[1, 2]], axis=1))
# age
# name
# Alice 24
# Bob 42
# Charlie 18
# Dave 68
# Ellen 24
# Frank 30
print(df.drop(columns=df.columns[[1, 2]]))
# age
# name
# Alice 24
# Bob 42
# Charlie 18
# Dave 68
# Ellen 24
# Frank 30
columnsが整数値であるときは、上述の行の場合と同様に注意が必要。
複数行・複数列を一括で削除
バージョン0.21.0以降は引数indexとcolumnsを同時に指定して、複数行・複数列を一括で削除できる。
行番号・列番号で指定したり、引数inplaceを指定したりすることも可能。
print(df.drop(index=['Bob', 'Dave', 'Frank'], columns=['state', 'point']))
# age
# name
# Alice 24
# Charlie 18
# Ellen 24
print(df.drop(index=df.index[[1, 3, 5]], columns=df.columns[[1, 2]]))
# age
# name
# Alice 24
# Charlie 18
# Ellen 24
df_copy = df.copy()
df_copy.drop(index=['Bob', 'Dave', 'Frank'], columns=['state', 'point'],
inplace=True)
print(df_copy)
# age
# name
# Alice 24
# Charlie 18
# Ellen 24