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