Pandas のstr.contaisを利用して指定の値を含まない行の抽出方法をまとめました。 データフレームの中身をクリーニング等で抽出作業は必須スキルです。 今回は、 str.contains("除きたい文字列") と 否定演算子~ を使って~df として指定の文字列を含まない行の抽出方法をまとめました。


行いたいことを図示します。

以下の事をPandas のデータフレーム上で行いたいと思います。

what_is_problem

str.contains と 否定演算子を使う

str.contains("除きたい文字列") と 否定演算子~ を使えば、簡単に抽出できます。 また、print(‘before/after:’, df.shape)を前後に挟むことで データフレームの前後のサイズを把握します。

1
2
3
print('before:', df.shape)
df = df[~df['メールアドレス'].str.contains('@example.org')]
print('after:', df.shape)

前後に配置したdf.shape でデータフレームのサイズのBefore/After を記録して抽出サイズ(削除された行数)を把握します。

>> before: (8, 3)
>> after: (6, 3)

抽出後のデータフレームは以下のとおりです。

what_is_output

練習データで指定する「値を含む」場合を示します

このブログで利用した練習用データフレームの作成から抽出までのコードは以下のとおりです。 今回は、「指定値を含む」ケースです。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 演習用のデータフレームを作成します。
df = pd.DataFrame({ '顧客番号': ['01285679', '01340788', '02123782', '10541976', '12297411', 
                             '13299899', '30144450', '47339981'],
                   '都道府県名': ["北海道","北海道",'青森県','群馬県','千葉県','東京都','和歌山県','沖縄県'],
                  'メールアドレス':   ["nabe@example.net","hiro@example.net","aatsu@example.net",
                               "hi106@example.org","im_to@example.co.jp","ka713@example.org",
                               "sato@example.com","oka_h@example.net"]},
                    index=[0, 1, 2, 3, 4, 5, 6,7])
# オリジナルのデータフレームを表示

df = df[df['メールアドレス'].str.contains('@example.org')]

display(df)

what_is_output

まとめ

Point

df = df[df['メールアドレス'].str.contains('@example.org')] 含むで抽出
df = df[~df['メールアドレス'].str.contains('@example.org')] 含まないで抽出