質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

777閲覧

【Pandas】pandasを活用して、税金の割合毎にデータを分割する方法

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/05/12 08:00

こんにちは。
pandasを活用して、税金割合によってデータを分割する方法がわからなかったので、
よろしければご助力お願い致します。

前提・実現したいこと

下記データ(下にもまだデータはありますが、割愛しています)について、
税率8%のものと、10%のものとにデータを分割したいです。

請求品目請求金額区分
携帯電話5000基本料金
食費(内)500生活費
消費税(10%)550消費税
食費(外)200生活費
消費税(8%)16消費税

見方として、
消費税10%に割り当てられている項目は、
携帯電話・食費(内)
消費税8%に割り当てられている項目は、
食費(外)
です。

発生している問題・エラーメッセージ

エラーメッセージはありません。

該当のソースコード

python

1import pandas as pd 2 3df = pd.read_excel("請求表.xlsx") 4

試したこと

考え方として、分割するキーは「請求品目」
の「消費税」をキーとして、
その文字が検知できたところから次の「消費税」の項目までをひとくくりとすることを実現したいのですが、
どのように実現したらいいのかが調べてもわかりませんでした。

補足情報(FW/ツールのバージョンなど)

Google Colab

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

.cumsumによって消費税行が現れるごとにカウントアップする数値を用いることによって、以下のように分けることができます。

Python

1import pandas as pd 2from io import StringIO 3pd.set_option('display.unicode.east_asian_width', True) 4 5s = """請求品目,請求金額,区分 6携帯電話,5000,基本料金 7食費(内),500,生活費 8消費税(10%),550,消費税 9食費(外),200,生活費 10消費税(8%),16,消費税""" 11df = pd.read_csv(StringIO(s)) 12print(df) 13 14zei = df['請求品目'].str.startswith('消費税') 15grp = zei.cumsum() 16 17# 18# 消費税行を含まず分ける場合 19# 20df1 = df[(zei == False) & (grp == 0)] 21df2 = df[(zei == False) & (grp == 1)] 22 23print(df1) 24# 請求品目 請求金額 区分 25#0 携帯電話 5000 基本料金 26#1 食費(内) 500 生活費 27 28print(df2) 29# 請求品目 請求金額 区分 30#3 食費(外) 200 生活費 31 32# 33# 消費税行を含めて分ける場合 34# 35 36grp[zei == False] += 1 # 消費税行と同じ番号になるように 37 38df1 = df[grp == 1] 39df2 = df[grp == 2] 40 41print(df1) 42# 請求品目 請求金額 区分 43#0 携帯電話 5000 基本料金 44#1 食費(内) 500 生活費 45#2 消費税(10%) 550 消費税 46 47print(df2) 48# 請求品目 請求金額 区分 49#3 食費(外) 200 生活費 50#4 消費税(8%) 16 消費税

投稿2021/05/12 08:31

can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/05/12 15:50

回答ありがとうございます。 累積和という考え方を適用されたのですね。 この考え方を初めて知ったので、まだ身にはついていませんが、学習し身に着けていきます。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2021/05/13 01:45 編集

grp部分に具体的な数値が記載されているので、 より汎用的に利用できるよう、for文もつけてみました。 ex) ======================== df1 = df[(zei == False) & (grp == 0)] ======================== の部分ですが、 ======================== s_bool = df["区分"] == "消費税" ns = s_bool.sum() for n in range(ns): dfx = df[(zei == False) & (grp == n)] print(dfx) ========================= としてみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問