Python 从dataframe按月更好地分组标签频率

Python 从dataframe按月更好地分组标签频率,python,pandas,Python,Pandas,我有一个带有日期+时间和标签的数据框,我想将其重塑为带有该月标签频率的日期/月份列: date_time label 1 2017-09-26 17:08:00 0 3 2017-10-03 13:27:00 2 4 2017-10-04 19:04:00 0 11 2017-10-11 18:28:00 1 27 2017-10-13 11:22:00 0 28 2017-

我有一个带有日期+时间和标签的数据框,我想将其重塑为带有该月标签频率的日期/月份列:

              date_time    label
1   2017-09-26 17:08:00        0
3   2017-10-03 13:27:00        2
4   2017-10-04 19:04:00        0
11  2017-10-11 18:28:00        1
27  2017-10-13 11:22:00        0
28  2017-10-13 21:43:00        0
39  2017-10-16 14:43:00        0
40  2017-10-16 21:39:00        0
65  2017-10-21 21:53:00        2
...
98  2017-11-01 20:08:00        3
99  2017-11-02 12:00:00        3
100 2017-11-02 12:01:00        2
109 2017-11-02 12:03:00        3
110 2017-11-03 22:24:00        0
111 2017-11-04 09:05:00        3
112 2017-11-06 12:36:00        3
113 2017-11-06 12:48:00        2
128 2017-11-07 15:20:00        2
143 2017-11-10 16:36:00        3
144 2017-11-10 20:00:00        0
145 2017-11-10 20:02:00        0
我将标签频率按月按此行分组,部分原因是:

哪个输出

date_time   label
2017-09-30  0        1
2017-10-31  0        6
            1        1
            2        8
            3        2
2017-11-30  0       25
            4        2
            5        1
            2        4
            3       11
2017-12-31  0       14
            5        3
            2        5
            3        7
2018-01-31  0        8
            4        1
            5        1
            2        2
            3        3
但是,如前所述,我希望按月份/日期列获取数据:

      2017-09-30  2017-10-31    2017-11-30    2017-12-31        2018-01-31  
0              1           6            25            14                 8
1              0           1             0             0                 0
2              0           8             4             5                 2
3              0           2            11             7                 3
4              0           0             2             0                 1
5              0           0             1             3                 1
目前,我可以用

pd.concat([df2[m] for m in df2.index.levels[0]], axis=1).fillna(0)
但是我丢失了列名:

            label  label  label  label  label
0             1.0    6.0   25.0   14.0    8.0
1             0.0    1.0    0.0    0.0    0.0
2             0.0    8.0    4.0    5.0    2.0
3             0.0    2.0   11.0    7.0    3.0
4             0.0    0.0    2.0    0.0    1.0
5             0.0    0.0    1.0    3.0    1.0
所以我必须做一个较长的版本,生成一个系列,重命名它,连接,然后填充空白:

m_list = []
for m in df2.index.levels[0]:
    m_labels = df2[m]
    m_labels = m_labels.rename(m)
    m_list.append(m_labels)

pd.concat(m_list, axis=1).fillna(0)
导致

            2017-09-30  2017-10-31  2017-11-30  2017-12-31  2018-01-31
0                  1.0         6.0        25.0        14.0         8.0
1                  0.0         1.0         0.0         0.0         0.0
2                  0.0         8.0         4.0         5.0         2.0
3                  0.0         2.0        11.0         7.0         3.0
4                  0.0         0.0         2.0         0.0         1.0
5                  0.0         0.0         1.0         3.0         1.0
有没有比我的原始数据集更短/更优雅的方法来获取最后一个数据集?

您只需在此处取消堆栈即可

基于您的groupby输出

            2017-09-30  2017-10-31  2017-11-30  2017-12-31  2018-01-31
0                  1.0         6.0        25.0        14.0         8.0
1                  0.0         1.0         0.0         0.0         0.0
2                  0.0         8.0         4.0         5.0         2.0
3                  0.0         2.0        11.0         7.0         3.0
4                  0.0         0.0         2.0         0.0         1.0
5                  0.0         0.0         1.0         3.0         1.0
df.groupby([pd.Grouper(key='date_time', freq='M'), 'label'])['label'].count().unstack(0,fill_value=0)
Out[235]: 
date_time  2017-09-30  2017-10-31  2017-11-30
label                                        
0                   1           5           3
1                   0           1           0
2                   0           2           3
3                   0           0           6
s.unstack(0,fill_value=0)
Out[240]: 
date_time  2017-09-30  2017-10-31  2017-11-30  2017-12-31  2018-01-31
label                                                                
0                   1           6          25          14           8
1                   0           1           0           0           0
2                   0           8           4           5           2
3                   0           2          11           7           3
4                   0           0           2           0           1
5                   0           0           1           3           1