从数据框架到月份更好地对标签频率进行分组

时间:2018-02-01 04:26:31

标签: 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-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

我使用此行按月分组标签频率(部分归功于this post):

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

是否有更短/更优雅的方式从原始数据框中获取最后一个数据框?

1 个答案:

答案 0 :(得分:1)

您只需要$(document).on("click", "button", function() { console.log(alpha); // Should print "data", });

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