質問: df.set_index('日付') df.groupby('名前').resample('M').sum() ``` | | | 金額 | | --- | --- | --- | | 名前 | 日付 | | | 佐藤 | 2020-01-31 | 1500 | | | 2020-02-29 | 4000 | | 山田 | 2020-01-31 | 1300 | | | 2020-02-29 | 5500 | | 田中 | 2020-01-31 | 2500 | | | 2020-02-29 | 1000 | 今回上記とは別に以下のようなデータを取得したいと思っています。 | | | 金額 | | --- | --- | --- | | 日付 | 名前 | | | 2020-01-31 | 佐藤 | 1500 | | | 山田 | 1300 | | | 田中 | 2500 | | 2020-02-29 | 佐藤 | 1500 | | | 山田 | 5500 | | | 田中 | 1000 |
回答: **【方法1】** DataFrame.swaplevel()でマルチインデックスの順番を変更し、DataFrame.sort_index()で行を適切な順番に並び替えます。 ``` 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('日付') df2 = df.groupby('名前').resample('M').sum() # 処理ここから df2.swaplevel().sort_index() ``` | 日付 | 名前 | 金額 | | --- | --- | --- | | 2020-01-31 | 佐藤 | 1500 | | | 山田 | 1300 | | | 田中 | 2500 | | 2020-02-29 | 佐藤 | 4000 | | | 山田 | 5500 | | | 田中 | 1000 | 追記: **【方法2】** pd.Grouper()を用いると、インデックスと通常の列の組み合わせでグルーピング処理を行うことができます。 ⇒pandas公式の解説 ``` 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([pd.Grouper(freq='M'), '名前']).sum() ``` | 日付 | 名前 | 金額 | | --- | --- | --- | | 2020-01-31 | 佐藤 | 1500 | | | 山田 | 1300 | | | 田中 | 2500 | | 2020-02-29 | 佐藤 | 4000 | | | 山田 | 5500 | | | 田中 | 1000 |