1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

IQ Bot カスタムロジック(Python):除外処理をループで効率化

Last updated at Posted at 2020-09-24

IQ Bot のカスタムロジックの中で、一番よく使う処理はなんといっても「置換」です。
不要な文字や記号の「除外」も「置換」の一種なので、カスタムロジックの使用ケースの8~9割がこれといっても過言ではないです。

置換・除外の基本的なやりかたは以下のページでご紹介していますが・・・

今日はそんな置換の中で、「除外」の処理をループを使って効率化するやり方を紹介します。

##どんなときに役立つ? (除外編)

印刷のかすれなどにより、取得項目に余計な記号が混じってしまうとしましょう。

「どこでも商事」が「どこでも商事.」(最後にドットが入っている)になってしまう場合は、こんなかんじで除外します。

通常の置換(除外)
field_value = field_value.replace(".","") 

上記はノイズが1種類(ドット)だけだったのでよかったですが、「ど*こ;で',も:商!事.」のようにたくさんの種類のノイズが混じってしまう場合はどうすればいいでしょうか?

まともにやると以下のようになります。

通常の置換(除外)
field_value = field_value.replace("*","") 
field_value = field_value.replace(";","") 
field_value = field_value.replace("'","") 
field_value = field_value.replace(",","") 
field_value = field_value.replace(":","") 
field_value = field_value.replace("!","") 
field_value = field_value.replace(".","") 

もし、他に「#」というノイズも除外したい!と思ったら、field_value = field_value.replace("#","") というロジックを追加します。

これでも間違いではないのですが、もうちょっと少ないロジックで書けますよ、というのが今回のおはなしです。

##ズバリ、やりかたはこうだ! (除外編)

上記とまったく同じことが、以下のコードでできます。

ループを使って除外を効率化
ignore_list = ("*",";","'",",",":","!",".")

for i in ignore_list:
    field_value = field_value.replace(i,"")

もし、上記でさらに「#」というノイズも除外したい!と思ったら、ignore_listの最後に#の要素を加えるだけです。

ignore_list = ("*",";","'",",",":","!",".","#")ということですね。
最後の"#"が追加された要素です。

##ループを使った除外の解説

Pythonがシーケンスに対してループをかけるときの基本的な文法がこちらです。

シーケンスって何じゃ? と思った方はこちらの記事(外部リンク)を参照してください。

さらに初心者向けの説明はこちら
リンク先ではシーケンスの一種である「リスト」について説明していますが、「リスト」以外にもいろんな種類のロッカーがあるんだな~くらいに思っていてください。

ちなみに上記のコードの ignore_list はタプルという型のシーケンスです。

で、以下がそのタプルの中身の要素に対して、ひとつひとつ処理をかけていくループです。
#以降が、各行でやっていることの説明です。

ループを使って除外を効率化
for i in ignore_list:                 #ignore_listの要素のひとつひとつを、iという変数に入れて順番に処理してね
    field_value = field_value.replace(i,"")   #field_valueの中のiを除外して、field_valueに代入してね

##テーブルの場合は? (除外編)

ループを使った効率化は、テーブルに対しても適用可能です。

テーブルの場合は、for文の中身をテーブル用の文法に変えて以下のように処理することもできますが……

ループを使って除外を効率化(テーブルの場合)
ignore_list = ("除外したい文字1","除外したい文字2","除外したい文字3")

for i in ignore_list:
    df['列名'] = df['列名'].str.replace(i,"")

美しいのは以下だと思います。

ループを使って除外を効率化(テーブルの場合)

ignore_list = ("除外したい文字1","除外したい文字2","除外したい文字3")

def table_ignore(x,y):        
    for i in y:
        x = x.replace(i,"")
    return x
        
df['列名'] = df['列名'].apply(table_replace,y=ignore_list)

一見、下の方がコード量が多く見えますが、除外したい文字列のセットが複数できる場合や、それらの組み合わせを自在に複数の列に適用したい場合などに、下の方が柔軟性があります。

##以上!

いかがでしたか?
常に初心者の味方がモットーの筆者ですが、今日のはさすがにプログラミング初心者向けの記事ではなかったかなという気がしています。

ご質問がある方は、この記事にコメントをお寄せいただくか、TwitterのDMにてご連絡ください。

※ 上記は毎日チェックできているわけではないため、回答に時間がかかる場合があります。
  IQぼっちをリアルにご存じの方は、仕事用のメールに質問をください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?