更好地从数据帧按月对标签频率进行分组



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

              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

我用这条线按月对标签频率进行分组(部分感谢这篇文章(:

df2 = df.groupby([pd.Grouper(key='date_time', freq='M'), 'label'])['label'].count()

哪些输出

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

有没有一种更短/更优雅的方式来从我的原始数据中获得最后一个数据?

你只需要unstack在这里

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

基于您的groupby输出

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

最新更新