pandas:データ削除【DELETE】方法


はじめに

ここに書いてあること

  • データの削除(データフレームの行削除)
  • df.dropを利用する
    • 削除にはインデックス番号が使われる
    • 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
    • 全文の結果と一致する


Posted by futa