回答編集履歴

1

処理方法を追加

2021/02/24 07:44

投稿

kirara0048
kirara0048

スコア1399

test CHANGED
@@ -1,3 +1,7 @@
1
+ **【方法1】**
2
+
3
+
4
+
1
5
  [DataFrame.swaplevel()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.swaplevel.html)でマルチインデックスの順番を変更し、[DataFrame.sort_index()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_index.html)で行を適切な順番に並び替えます。
2
6
 
3
7
 
@@ -49,3 +53,69 @@
49
53
  | | 山田 | 5500 |
50
54
 
51
55
  | | 田中 | 1000 |
56
+
57
+
58
+
59
+ ---
60
+
61
+
62
+
63
+ 追記:
64
+
65
+
66
+
67
+ **【方法2】**
68
+
69
+
70
+
71
+ [pd.Grouper()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Grouper.html)を用いると、インデックスと通常の列の組み合わせでグルーピング処理を行うことができます。
72
+
73
+ ⇒[pandas公式の解説](https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html#grouping-dataframe-with-index-levels-and-columns)
74
+
75
+
76
+
77
+ ```python
78
+
79
+ import pandas as pd
80
+
81
+
82
+
83
+ # 質問文のコード
84
+
85
+ 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'],
86
+
87
+ '名前': ['山田' , '田中' , '山田' , '田中' , '佐藤' , '山田' , '田中' , '山田' , '山田' , '佐藤' ],
88
+
89
+ '金額': [1000,500,300,2000,1500,500,1000,3000,2000,4000]}
90
+
91
+ df = pd.DataFrame(data)
92
+
93
+ df['日付'] = pd.to_datetime(df['日付'],format='%Y/%m/%d')
94
+
95
+ df = df.set_index('日付')
96
+
97
+
98
+
99
+ # 処理ここから
100
+
101
+ df.groupby([pd.Grouper(freq='M'), '名前']).sum()
102
+
103
+ ```
104
+
105
+
106
+
107
+ | 日付 | 名前 | 金額 |
108
+
109
+ |:-----------|:-------|-------:|
110
+
111
+ | 2020-01-31 | 佐藤 | 1500 |
112
+
113
+ | | 山田 | 1300 |
114
+
115
+ | | 田中 | 2500 |
116
+
117
+ | 2020-02-29 | 佐藤 | 4000 |
118
+
119
+ | | 山田 | 5500 |
120
+
121
+ | | 田中 | 1000 |