DataFrameの特定の要素に特定の文字列を含む行の抽出と削除

pandasのDataFrameの特定の列の要素に指定した文字列を含む行を抽出する方法と、その行を削除する方法です。

containsという関数を使用します。

目次

  1. str.contains
  2. 使用方法
  3. 指定した文字列を含む行を抽出する
  4. 指定した文字列を含む行を削除する

str.contains

指定した文字列パターンが含まれるかどうかを示すSeriesやIndexを返す関数です。

se = Series.str.contains(pat, [case], [flags], [na], [regex])

引数

内容

pat

str

文字列または正規表現。

case

bool

規定値はTrue。大文字小文字を区別するかどうか。

flags

int

規定値は0(フラグ無し)。reモジュールに渡すフラグ。

na

scalar

規定値はデータ型による。patに一致しない行の値を何で返すか。

regex

bool

規定値はTrue。patが正規表現かどうか。

se

パターンにマッチしたかどうかを示すSeriesまたはIndex。

使用方法

str.containsが何を返すか見てみます。

サンプルとしてseabornのmpgデータセットを使用します。 このデータは、name列に車種の名前のデータが入っています。

import seaborn as sns
import pandas as pd
df = sns.load_dataset('mpg')
print(df['name'].head())

0    chevrolet chevelle malibu
1            buick skylark 320
2           plymouth satellite
3                amc rebel sst
4                  ford torino
Name: name, dtype: object

いろいろな車種があるようです。

corollaを指定してみましょう。

se = df['name'].str.contains('corolla')
print(se)
print(type(se))

0      False
1      False
2      False
3      False
4      False
       ...
393    False
394    False
395    False
396    False
397    False
Name: name, Length: 398, dtype: bool

<class 'pandas.core.series.Series'>

name列にcorollaを含む行だけをTrueにしたSeriesが出力されました。

指定した文字列を含む行を抽出する

では、DataFrameの中でname列にcorollaを含む行を抽出してみましょう。

print(df[df['name'].str.contains('corolla')])

      mpg  cylinders  displacement  horsepower  weight  acceleration  \
53   31.0          4          71.0        65.0    1773          19.0
84   27.0          4          97.0        88.0    2100          16.5
131  32.0          4          71.0        65.0    1836          21.0
167  29.0          4          97.0        75.0    2171          16.0
205  28.0          4          97.0        75.0    2155          16.4
235  26.0          4          97.0        75.0    2265          18.2
310  38.1          4          89.0        60.0    1968          18.8
321  32.2          4         108.0        75.0    2265          15.2
356  32.4          4         108.0        75.0    2350          16.8
382  34.0          4         108.0        70.0    2245          16.9

     model_year origin                      name
53           71  japan       toyota corolla 1200
84           72  japan  toyota corolla 1600 (sw)
131          74  japan       toyota corolla 1200
167          75  japan            toyota corolla
205          76  japan            toyota corolla
235          77  japan   toyota corolla liftback
310          80  japan     toyota corolla tercel
321          80  japan            toyota corolla
356          81  japan            toyota corolla
382          82  japan            toyota corolla

抽出されましたね。

corollaの代わりに正規表現を指定することもできます。

指定した文字列を含む行を削除する

では、corollaを含む行を削除してみます。

その前に、toyotaを含む行を抽出してvalue_countしてみます。

print(df[df['name'].str.contains('toyota')]['name'].value_counts())

name
toyota corolla               5
toyota corona                4
toyota corolla 1200          2
toyota mark ii               2
toyota corona mark ii        1
toyota corona hardtop        1
toyota corolla 1600 (sw)     1
toyota carina                1
toyota corolla liftback      1
toyota celica gt liftback    1
toyota corolla tercel        1
toyota corona liftback       1
toyota starlet               1
toyota tercel                1
toyota cressida              1
toyota celica gt             1
Name: count, dtype: int64

行を削除した後に、またvalue_countしてみます。

行を削除するにはDataFrameのdropメソッドを使用します。dropメソッドの引数として、文字列にマッチする行のindexを渡すわけです。

df.drop(df[df['name'].str.contains('corolla')].index, inplace=True)
print(df[df['name'].str.contains('toyota')]['name'].value_counts())

name
toyota corona                4
toyota mark ii               2
toyota corona mark ii        1
toyota corona hardtop        1
toyota carina                1
toyota celica gt liftback    1
toyota corona liftback       1
toyota starlet               1
toyota tercel                1
toyota cressida              1
toyota celica gt             1
Name: count, dtype: int64

corollaを含む行が無くなりました。

公開日

広告