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

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

ただいまの
回答率

87.49%

Pandasでsumifsのような集計(複数条件での集計)をしたい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 4,437

score 811

下記のように、工事一覧と支払一覧の表があります。

工事一覧

codeは工事番号、nameは工事名、complete_dateは完成日です。

code name complete_date
1 A 2018/10/2
2 B 2018/11/2
3 C 2018/12/4
支払一覧

dateは支払日、codeは工事番号、amountは支払金額、month_endは支払日が属する月の末日

date code amount month_end
2018/10/10 1 400000 2018/10/31
2018/10/10 2 300000 2018/10/31
2018/10/10 3 500000 2018/10/31
2018/11/10 1 1000000 2018/11/30
2018/11/10 2 3000000 2018/11/30
2018/11/10 3 2000000 2018/11/30
2018/12/10 1 2000000 2018/12/31
2018/12/10 2 3000000 2018/12/31
2018/12/10 3 100000 2018/12/31
2019/1/10 1 0 2019/1/31
2019/1/10 2 400000 2019/1/31
2019/1/10 3 600000 2019/1/31

最終的に、下記のように、工事毎、支払毎の集計をしたいです。

番号リスト工事毎、支払毎の集計
code 2018/10/31 2018/11/30 2018/12/31 2019/1/31
1 400000 100000 200000 0
2 300000 3000000 3000000 400000
3 500000 2000000 100000 600000
mport pandas as pd
# 工事一覧のデータフレーム
site_list_df = pd.DataFrame([
    [1, 'A', '2018-10-2'],
    [2, 'B', '2018-11-2'],
    [3, 'C', '2018-12-2']
], columns=['code', 'name', 'complete_date'])
site_list_df['complete_date'] = pd.to_datetime(site_list_df['complete_date'])
# 支払い情報のデータフレーム
cost_list_df = pd.DataFrame([
    ['2018/10/10', 1, 400000, '2018/10/31'], 
    ['2018/10/10', 2, 300000, '2018/10/31'],
    ['2018/10/10', 3, 500000, '2018/10/31'],
    ['2018/11/10', 1, 1000000, '2018/11/30'],
    ['2018/11/10', 2, 3000000, '2018/11/30'],
    ['2018/11/10', 3, 2000000, '2018/11/30'],
    ['2018/12/10', 1, 2000000, '2018/12/31'],
    ['2018/12/10', 2, 3000000, '2018/12/31'],
    ['2018/12/10', 3, 100000, '2018/12/31'],
    ['2019/1/10', 2, 400000, '2019/1/31'],
    ['2019/1/10', 3, 600000, '2019/1/31'],    
], columns=['cost_date', 'code', 'amount', 'month_end'])
month_end_list = cost_list_df['month_end'].drop_duplicates()


上記の通り、コードを書いてみたのですが、どうしたらそのような集計ができるのか。分かりません。
エクセルであれば、sumifs関数を用いて、codeとmonth_endの条件で集計すれば良いかと思います。

未成工事支出金から、完成工事原価に振り替える会計処理をしたいと考えており、そのための集計をしたいと考えております。(工事完成までの間の支出は全て未成工事支出金に計上され、工事完成時に完成工事原価に振り替えます。工事完成後の支出はいったん未成工事支出金に計上され、月末に完成工事原価に振り替えます。)

お分かりの方、ご教示頂ければ幸いです。
宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

番号リスト工事毎、支払毎の集計

であれば、以下のようにピボットテーブルのみで実現できるかと思います。
参考:pandasのピボットテーブルでカテゴリ毎の統計量などを算出

import pandas as pd
import numpy as np

# 支払い情報のデータフレーム
cost_list_df = pd.DataFrame([
    ['2018/10/10', 1, 400000, '2018/10/31'], 
    ['2018/10/10', 2, 300000, '2018/10/31'],
    ['2018/10/10', 3, 500000, '2018/10/31'],
    ['2018/11/10', 1,1000000, '2018/11/30'],
    ['2018/11/10', 2,3000000, '2018/11/30'],
    ['2018/11/10', 3,2000000, '2018/11/30'],
    ['2018/12/10', 1,2000000, '2018/12/31'],
    ['2018/12/10', 2,3000000, '2018/12/31'],
    ['2018/12/10', 3, 100000, '2018/12/31'],
    ['2019/1/10' , 2, 400000, '2019/1/31'],
    ['2019/1/10' , 3, 600000, '2019/1/31'],
], columns=['cost_date', 'code', 'amount', 'month_end'])

df = pd.pivot_table(cost_list_df, index='code', columns='month_end', aggfunc=np.sum).fillna(0)
print(df)
"""
              amount
month_end 2018/10/31 2018/11/30 2018/12/31 2019/1/31
code
1           400000.0  1000000.0  2000000.0       0.0
2           300000.0  3000000.0  3000000.0  400000.0
3           500000.0  2000000.0   100000.0  600000.0
"""

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る