pandas:データ削除【DELETE】方法
目次
はじめに
ここに書いてあること
- データの削除(データフレームの行削除)
- df.dropを利用する
- 削除にはインデックス番号が使われる
- indexキーを利用すれば文字列のインデックス列も扱える
前提
- データ(データフレーム)作成
- boolインデックス参照
- df.set_index
サンプルコード
行削除(インデックス番号利用)
データ作成
import numpy as np
import pandas as pd
df = pd.DataFrame(np.arange(20).reshape(5,4), columns=['a','b','c','d'])
print(df)
print(df.shape)
a b c d 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 3 12 13 14 15 4 16 17 18 19 (5, 4)
- サイズ(5,4)のデータを作成
1行削除
df = df.drop(0)
print(df)
print(df.shape)
a b c d 1 4 5 6 7 2 8 9 10 11 3 12 13 14 15 4 16 17 18 19 (4, 4)
- df.drop(0)
- 引数にインデックス番号を指定する
- インデックス番号を指定すると覚えておく
複数行削除
df.drop([1,3], inplace=True)
print(df)
print(df.shape)
a b c d 2 8 9 10 11 4 16 17 18 19 (2, 4)
- [1,3]
- 削除するインデックス番号をリストで指定
- inplace=True
- 元データを削除する
- inplace=Falseがデフォルト
行削除(インデックス列がある場合)
データ作成
import numpy as np
import pandas as pd
df = pd.DataFrame({'id':['a01','a02','a03','b01','b02'],'name':['x','y','z','p','q'],'value':[20,50,30,10,20]})
df = df.set_index('id')
print(df)
print(df.shape)
name value id a01 x 20 a02 y 50 a03 z 30 b01 p 10 b02 q 20 (5, 2)
- サイズ(5,2)のデータを作成
- インデックス列に「id」を設定
1行削除
df.drop(index='a01', inplace=True)
print(df)
name value id a02 y 50 a03 z 30 b01 p 10 b02 q 20
- index=’a01′
- インデックス列idは文字列のため、indexキーを利用する
- a01を削除
- inplace=True
- 元のデータフレームから削除
- デフォルトはFalse
複数行削除
df.drop(index=['b01','b02'], inplace=True)
print(df)
name value id a02 y 50 a03 z 30
- index=['b01′,’b02’]
- 複数の場合はリストで指定する
- b01,b02を削除
- inplace=True
- 元のデータフレームから削除
- デフォルトはFalse
応用
部分一致の行削除(インデックス列利用)
はじめに
- 正規表現を使った部分一致のデータ抽出方法を利用
- 部分一致を説明した記事
データ作成
import numpy as np
import pandas as pd
df = pd.DataFrame({'id':['a01','a02','a03','b01','b02'],'name':['x','y','z','p','q'],'value':[20,50,30,10,20]})
df = df.set_index('id')
print(df)
print(df.shape)
name value id a01 x 20 a02 y 50 a03 z 30 b01 p 10 b02 q 20 (5, 2)
- インデックス列id
- aで始まるものとbで始まるものがある
- name
- 20のデータが2つある
全文
df.drop(index=df.index[df.index.str.contains('^a')])
name value id b01 p 10 b02 q 20
- aで始まる’a01′,’a02′,’a03’が削除された
- df.index.str.contains(…)
- 部分一致
- boolインデックス
- df.index[…]
- インデックス列からデータ取り出し
- df.drop(index=…)
- インデックス列の文字列で削除
部分実行(df.index.str.contains(…))
df.index.str.contains('^a')
array([ True, True, True, False, False])
- インデックス列は文字列なのでdf.indexを使う
- boolインデックスが戻る
- 正規表現が使えるstr.containsを利用
- ’^a’
- 前方一致の正規表現「^」
- aで始まる
部分実行(df.index[…])
w = df.index.str.contains('^a')
df.index[w]
Index(['a01', 'a02', 'a03'], dtype='object', name='id')
- w
- 前項の結果の通りboolインデックス
- df.index[w]
- 引数にboolインデックスを指定
- インデックス列の値を返す
部分実行(df.drop(index=…))
w = df.index[df.index.str.contains('^a')]
df.drop(index=w)
name value id b01 p 10 b02 q 20
- w
- 前項の結果の通り削除対象の列データ(文字列)
- df.drop(index=w)
- indexキーを利用して文字列指定
- 全文と同様の結果となる
列を条件にした行削除
データ作成
import numpy as np
import pandas as pd
df = pd.DataFrame({'id':['a01','a02','a03','b01','b02'],'name':['x','y','z','p','q'],'value':[20,50,30,10,20]})
print(df)
print(df.shape)
id name value 0 a01 x 20 1 a02 y 50 2 a03 z 30 3 b01 p 10 4 b02 q 20 (5, 3)
- サイズ(5,3)のデータ(データフレーム)を作成
- value列に20が2つある
全文
df.drop(df.index[df.value==20])
id name value 1 a02 y 50 2 a03 z 30 3 b01 p 10
- value列が20の行が削除されている
- df.value==20
- boolインデックスを返す
- df.index[…]
- インデックス番号を取得する
- df.drop(…)
- インデックス番号の列を削除する
部分実行(df.value==20)
df.value==20
0 True 1 False 2 False 3 False 4 True Name: value, dtype: bool
- 列名valueで20の行を指定
- boolインデックス
- インデックス番号1,4がTrueになっている
部分実行(df.index[…])
w = df.value==20
df.index[w]
Int64Index([0, 4], dtype='int64')
- w
- 前項の通りboolインデックスを返す
- df.index
- Trueになっている行のインデックス番号[0,4]
- インデックスリストで返す
部分実行(df.drop(…))
w = df.index[df.value==20]
df.drop(w)
id name value 1 a02 y 50 2 a03 z 30 3 b01 p 10
- w
- 前項の通り[0,4]のインデックス番号になっている
- df.drop
- 引数にインデックス番号の行を削除
- 指定されたインデックス番号0,4
- 全文の結果と一致する
