note.nkmk.me

pandas.DataFrameの行・列を指定して削除するdrop

Date: 2017-12-30 / Modified: 2019-07-11 / tags: Python, pandas

pandas.DataFrameの行・列を指定して削除するにはdrop()メソッドを使う。

バージョン0.21.0より前は引数labelsaxisで行・列を指定する。0.21.0以降は引数indexまたはcolumnsが使えるようになった。

ここでは以下の内容について説明する。

  • DataFrameの行を指定して削除
    • 行名(行ラベル)で指定
    • 行番号で指定
    • 行名が設定されていない場合の注意点
  • DataFrameの列を指定して削除
    • 列名(列ラベル)で指定
    • 列番号で指定
  • 複数行・複数列をまとめて削除

欠損値NaNの削除や要素が重複した行の削除については以下の記事を参照。

サンプルコードでは例として以下のデータを使用する。

import pandas as pd

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

csvファイルはコチラ。

スポンサーリンク

DataFrameの行を指定して削除

行名(行ラベル)で指定

第一引数labelsと第二引数axisで指定する。行の場合はaxis=0

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

デフォルトがaxis=0なので、axisは省略可能。

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が返される。引数inplaceTrueにすると元のDataFrameが変更される。この場合、新しいDataFrameは返されず、返り値はNone

df_org = df.copy()
df_org.drop(index=['Bob', 'Dave', 'Frank'], inplace=True)
print(df_org)
#          age state  point
# name                     
# Alice     24    NY     64
# Charlie   18    CA     70
# Ellen     24    CA     88

行番号で指定

行番号で指定したい場合はDataFrameindex属性を利用する。

index属性の[]に行番号を指定すると対応する行名が取得できる。複数の行番号をリストで指定可能。

print(df.index[[1, 3, 5]])
# Index(['Bob', 'Dave', 'Frank'], dtype='object', name='name')

これをdrop()の第一引数labelsindexに指定すればよい。

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)
# Int64Index([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の列を指定して削除

列名(列ラベル)で指定

引数labelsaxisで指定する。列の場合は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についても行の場合と同様。

df_org = df.copy()
df_org.drop(columns=['state', 'point'], inplace=True)
print(df_org)
#          age
# name        
# Alice     24
# Bob       42
# Charlie   18
# Dave      68
# Ellen     24
# Frank     30

列番号で指定

行番号で指定したい場合はDataFramecolumns属性を利用する。

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以降からは引数indexcolumnsを同時に指定して複数行・複数列をまとめて削除することができる。

もちろん、行番号・列番号で指定したり、引数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_org = df.copy()
df_org.drop(index=['Bob', 'Dave', 'Frank'],
            columns=['state', 'point'], inplace=True)
print(df_org)
#          age
# name        
# Alice     24
# Charlie   18
# Ellen     24
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事