DataFrameの特定の要素に特定の文字列を含む行の抽出と削除
pandasのDataFrameの特定の列の要素に指定した文字列を含む行を抽出する方法と、その行を削除する方法です。
containsという関数を使用します。
目次
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を含む行が無くなりました。
公開日
広告
Pythonでデータ分析カテゴリの投稿
- DataFrameの欠損値を特定の値で置き換える
- DataFrameの特定の要素に特定の文字列を含む行の抽出と削除
- Pythonでpandas入門1(データの入力とデータへのアクセス)
- Pythonでpandas入門2(データの追加と削除および並び替え)
- Pythonでpandas入門3(データの統計量の計算)
- Pythonでpandas入門4(データの連結と結合)
- Pythonでpandas入門5(欠損値(NaN)の扱い)
- Pythonでデータを学習用と検証用に分割する
- Pythonでデータ分析入門1(初めての回帰分析)
- Pythonでデータ分析入門2(初めてのロジスティック回帰(2クラス分類))
- Pythonでデータ分析入門3(初めての決定木(多クラス分類))
- Pythonで回帰モデルの評価関数
- Pythonで箱ひげ図を描く
- Python(pandas)でExcelファイルを読み込んでDataFrameにする
- pandasでカテゴリ変数を数値データに変換する
- pandasでクロス集計する
- pandasで同じデータ(要素)がいくつあるか調べる
- pandasで相関係数を計算する
- pandasとseabornでデータの可視化(散布図行列)
- pandasの学習用のデータセットを入手する
- scikit-learnのサンプルデータセットを入手する