Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

つとむ先生のpandasドリル【名前にどちらかの文字を含んでいる行を除くには?】

f:id:kenken0326:20200217175614p:plain

f:id:kenken0326:20191021153602p:plain
tsutomu こんにちはPyQチームのtsutomuです。
pandasドリル第4回の問題は「名前にどちらかの文字を含んでいる行を除くには?」です。

つとむ先生の紹介

20数年、最適化関連の案件に従事するビープラウドの技術士(情報工学)。2014年より最適化のモデル作成にPythonを使い始め、効率的に開発できるようになる。東京海洋大学、青山学院大学、慶應義塾大学に非常勤講師としての勤務経験がある。また、オペレーションズ・リサーチ学会に約30年所属し、理事を2期務めた。
主な著書はモデリングの諸相Python言語によるビジネスアナリティクス今日から使える!組合せ最適化データ分析ライブラリーを用いた最適化モデルの作り方

問題

f:id:kenken0326:20191021153602p:plain
tsutomu Name列に'ic'または'ob'が含まれている行以外を取り出すにはどうすればいいでしょうか?

DataFrame

import pandas as pd

df = pd.DataFrame(
    [
        ['Alice', '国語', 87],
        ['Alice', '算数', 72],
        ['Bob', '国語', 65],
        ['Bob', '算数', 92],
    ],
    columns=['Name', 'Subject', 'Point'])
Name Subject Point
0 Alice 国語 87
1 Alice 算数 72
2 Bob 国語 65
3 Bob 算数 92

回答

result = df[~df.Name.str.contains('ic|ob')]

解説

strアクセサのcontainsは正規表現を指定できます。 Name列にicobも含んでいない行の取得は、df[~df.Name.str.contains('ic|ob')]のようにできます。

ちなみに、「含んでいる」ではなく「一致している」場合はinが使えます。 たとえば、「Name列が"Alice"または"Bob"である行以外は、df.query('Name not in ("Alice", "Bob")')」になります。

お知らせ

PyQでは「pandasチャレンジ」パートをリリースしました。
PyQで学習中の方はぜひトライしてみてください。

blog.pyq.jp

前回の問題

第3問【名前に特定の文字を含んでいる行を除くには?】はこちらをご覧ください。

blog.pyq.jp

Copyright ©2017- BeProud Inc. All rights reserved.