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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

Q&A

解決済

2回答

858閲覧

pandasで月毎の合計を名前別に取得したい

hirohir03146

総合スコア3

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

0グッド

1クリップ

投稿2021/02/23 13:20

編集2021/02/23 13:26

pandasでDataFrameから月ごとの合計を名前別に取得したいのですがうまくいきません。
どのように実装すればよろしいでしょうか。
以下のコードで名前毎に月別の合計値を取得できますが、月毎に名前別のデータを取得できません。

import pandas as pd data = {'日付': ['2020/01/01','2020/01/01','2020/01/03','2020/01/03','2020/01/03','2020/02/06','2020/02/06','2020/02/08','2020/02/10','2020/02/10'], '名前': ['山田' , '田中' , '山田' , '田中' , '佐藤' , '山田' , '田中' , '山田' , '山田' , '佐藤' ], '金額': [1000,500,300,2000,1500,500,1000,3000,2000,4000]} df = pd.DataFrame(data) df['日付'] = pd.to_datetime(df['日付'],format='%Y/%m/%d') df = df.set_index('日付') df.groupby('名前').resample('M').sum()
金額
名前日付
佐藤2020-01-311500
2020-02-294000
山田2020-01-311300
2020-02-295500
田中2020-01-312500
2020-02-291000

今回上記とは別に以下のようなデータを取得したいと思っています。

金額
日付名前
2020-01-31佐藤1500
山田1300
田中2500
2020-02-29佐藤1500
山田5500
田中1000

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

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

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

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

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

guest

回答2

0

ベストアンサー

【方法1】

DataFrame.swaplevel()でマルチインデックスの順番を変更し、DataFrame.sort_index()で行を適切な順番に並び替えます。

python

1import pandas as pd 2 3# 質問文のコード 4data = {'日付': ['2020/01/01','2020/01/01','2020/01/03','2020/01/03','2020/01/03','2020/02/06','2020/02/06','2020/02/08','2020/02/10','2020/02/10'], 5 '名前': ['山田' , '田中' , '山田' , '田中' , '佐藤' , '山田' , '田中' , '山田' , '山田' , '佐藤' ], 6 '金額': [1000,500,300,2000,1500,500,1000,3000,2000,4000]} 7df = pd.DataFrame(data) 8df['日付'] = pd.to_datetime(df['日付'],format='%Y/%m/%d') 9df = df.set_index('日付') 10df2 = df.groupby('名前').resample('M').sum() 11 12# 処理ここから 13df2.swaplevel().sort_index()
日付名前金額
2020-01-31佐藤1500
山田1300
田中2500
2020-02-29佐藤4000
山田5500
田中1000

追記:

【方法2】

pd.Grouper()を用いると、インデックスと通常の列の組み合わせでグルーピング処理を行うことができます。
pandas公式の解説

python

1import pandas as pd 2 3# 質問文のコード 4data = {'日付': ['2020/01/01','2020/01/01','2020/01/03','2020/01/03','2020/01/03','2020/02/06','2020/02/06','2020/02/08','2020/02/10','2020/02/10'], 5 '名前': ['山田' , '田中' , '山田' , '田中' , '佐藤' , '山田' , '田中' , '山田' , '山田' , '佐藤' ], 6 '金額': [1000,500,300,2000,1500,500,1000,3000,2000,4000]} 7df = pd.DataFrame(data) 8df['日付'] = pd.to_datetime(df['日付'],format='%Y/%m/%d') 9df = df.set_index('日付') 10 11# 処理ここから 12df.groupby([pd.Grouper(freq='M'), '名前']).sum()
日付名前金額
2020-01-31佐藤1500
山田1300
田中2500
2020-02-29佐藤4000
山田5500
田中1000

投稿2021/02/24 01:23

編集2021/02/24 07:44
kirara0048

総合スコア1399

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

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

hirohir03146

2021/02/24 08:35

ご回答ありがとうございます。 方法2ですと最初から日付け毎、名前別に取得できるのでこちらで実装します!
guest

0

冗長な気もしますが下記で一応出来たかと思います。

python

1df2 = df.groupby('名前').resample('M').sum() 2df2 = df2.reset_index().set_index('日付').groupby(['日付','名前']).sum() 3print(df2) 4# 金額 5#日付 名前 6#2020-01-31 佐藤 1500 7# 山田 1300 8# 田中 2500 9#2020-02-29 佐藤 4000 10# 山田 5500 11# 田中 1000

投稿2021/02/23 13:49

編集2021/02/23 13:49
meg_

総合スコア10577

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

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

jeanbiego

2021/02/24 01:07

横から失礼しますが、 最後は単に`df2 = df2.groupby(['日付','名前']).sum()`でも良いかと思います。
meg_

2021/02/24 01:29

そうでしたね。アドバイスありがとうございます。ただコメントではなく回答として回答された方が良いかとおもいます。
hirohir03146

2021/02/24 08:46

reset_indexなしでも同じ結果になりました! ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問