#帳票例:テーブルの列を自由に分割する
こちらの記事では上記と同じテーブルから金額部分だけを取り出すやりかたを紹介しましたが、今回はそのさらに応用編です。
金額部分だけではなく、税区分、税率も、それぞれ必要で、しかも別の列に入れたい! という場合を考えます。
#考え方
この場合は、以下のように考えます。
① IQ Botには、ほしい項目のフィールドをそれぞれ定義しておく(Step1:項目設設定)
② 代表して1フィールドに、ほしい項目全体をマッピングしておく(Step2:マッピング設定)
③ カスタムロジックを使って、しかるべき部分をしかるべき列に移動させる(Step3:カスタムロジック)
以下、それぞれのステップを詳述します。
#Step1:項目設定
この場合、テーブルフィールドの定義項目として「金額」の他に「税区分」「税率」が必要になります。
もし「金額」しか作っていない場合は、「税区分」「税率」を追加します。
項目追加のやりかたはこちらを参照してください。
#Step2:マッピング設定
マッピングの設定はこちらと同様、取得したい値がある全範囲をまとめてひとつの項目として学習させます。
今回は「金額」欄に、一時的に以下のような形で金額・税区分・税率をまとめて入れておきます。
#Step3:カスタムロジック
上記のマッピング設定が完了したら、次はカスタムロジックでそれぞれの欄に値を取り出していきます。
カスタムロジックの組み方は、帳票の内容によって千差万別なので一般化は本当に難しいですが、上記の帳票を処理する場合の実装例は以下のとおりです。
##カスタムロジック実装例
# 値を保存する変数: table_values
#表の操作をするときに必ず入れるコード(最初)
import pandas as pd
df = pd.DataFrame(table_values)
#############################################
# ↓↓↓ ここからが今回の処理 ↓↓↓
#############################################
#税区分を抽出する関数
def zeikubun(x):
result = ""
cnt = 0
kubun = ("外税","内税")
for i in kubun:
if i in x:
result = i
cnt = cnt + 1
if cnt > 1:
result = "エラー"
return result
#税区分を抽出する関数の適用
df['税区分'] = df['金額'].apply(zeikubun)
#税率を抽出する処理
def zeiritsu(x):
result = ""
splitter = ("外税","内税") #Point1:分割の根拠となる文字列
for i in splitter:
if i in x:
result = x.split(i)[1] #Point2:↑を根拠に分割した上で、分割したどの部分を取り出すかの指定
return result
#金額欄に定義した関数を適用する
df['税率'] = df['金額'].apply(zeiritsu)
#金額を抽出する処理
def kingaku(x):
result = ""
splitter = ("外税","内税") #Point1:分割の根拠となる文字列
for i in splitter:
if i in x:
result = x.split(i)[0] #Point2:↑を根拠に分割した上で、分割したどの部分を取り出すかの指定
if result == "":
result = x
return result
#金額欄に定義した関数を適用する
df['金額'] = df['金額'].apply(kingaku)
#############################################
# ↑↑↑ ここまでが今回の処理 ↑↑↑
#############################################
#表の操作をするときに必ず入れるコード(最後)
table_values = df.to_dict()
#最後に
さすがにこの処理をpythonやプログラミング言語の素養が全然ない人が実務で実装することは考えにくいので、カスタムロジックの初心者向けの説明は省略します。
pythonなり、他の言語をやったことあれば、上記の処理で何をやっているかはだいたい想像がつくかなと思います。
が、もし何かわからなくて困ったことがあれば、この記事にコメントを投稿していただくか、twitterで @IQ_Bocchi までご連絡いただければ、可能な限りお答えします。