如何根据月份对列进行分组

时间:2019-08-09 09:10:00

标签: python-3.x pandas pandas-groupby

我需要使用pandas数据透视表或分组方式根据月份对列进行分组

我尝试了多种格式的数据透视表,但这无济于事

data_frame4 = pd.pivot_table(data_frame4, index=['PC'], values=['Bill1', 'Bill2', 'Bill3'], columns=['Month'], margins=True, fill_value=0)

我的输入(data_frame4):

PC  Month   Bill1   Bill2   Bill3
A   Feb-19    1       1        1
A   April-19  1       1         1
B   Feb-19     1      1         1
B   April-19   1      1         1
C   Feb-19     1      1         1
C   April-19   1      1         1

我的代码输出:

           Bill1           Bill2       Bill3        
Month   Apr-19  Feb-19  Apr-19  Feb-19  Apr-19  Feb-19  
PC  
A          1       1    1       1          1    1   
B          1       1    1       1          1    1   
C          1       1    1       1          1    1   

我想要的输出:

           Feb-19                Apr-19     
PC  Bill1   Bill2   Bill3   Bill1   Bill2   Bill3
A         1     1    1       1       1       1
B         1     1    1       1       1       1
C         1     1    1       1       1       1

1 个答案:

答案 0 :(得分:0)

首先将列转换为日期时间和月份期间:

data_frame4['Month'] = pd.to_datetime(data_frame4['Month']).dt.to_period('m')
print (data_frame4)
  PC    Month  Bill1  Bill2  Bill3
0  A  2019-02      1      1      1
1  A  2019-04      1      1      1
2  B  2019-02      1      1      1
3  B  2019-04      1      1      1
4  C  2019-02      1      1      1
5  C  2019-04      1      1      1

然后在月份月份中使用pivot_table(为了正确订购,不能使用月份名称):

data_frame4 = pd.pivot_table(data_frame4, 
                             index=['PC'], 
                             values=['Bill1', 'Bill2', 'Bill3'], 
                             columns=['Month'], 
                             margins=True, 
                             fill_value=0)
print (data_frame4)
                    Bill1                                       Bill2  \
Month 2019-02-01 00:00:00 2019-04-01 00:00:00 All 2019-02-01 00:00:00   
PC                                                                      
A                       1                   1   1                   1   
B                       1                   1   1                   1   
C                       1                   1   1                   1   
All                     1                   1   1                   1   

                                            Bill3                          
Month 2019-04-01 00:00:00 All 2019-02-01 00:00:00 2019-04-01 00:00:00 All  
PC                                                                         
A                       1   1                   1                   1   1  
B                       1   1                   1                   1   1  
C                       1   1                   1                   1   1  
All                     1   1                   1                   1   1

最后一次交换级别,进行排序,然后在最后一步中以列表理解方式转换为month-year格式:

data_frame4 = data_frame4.swaplevel(0,1, axis=1).sort_index(axis=1)
tuples = [(a.strftime('%b-%y'), b) if a != 'All' else (a, b) for a, b in data_frame4.columns]
data_frame4.columns = pd.MultiIndex.from_tuples(tuples)
print (data_frame4)
    Feb-19             Apr-19               All            
     Bill1 Bill2 Bill3  Bill1 Bill2 Bill3 Bill1 Bill2 Bill3
PC                                                         
A        1     1     1      1     1     1     1     1     1
B        1     1     1      1     1     1     1     1     1
C        1     1     1      1     1     1     1     1     1
All      1     1     1      1     1     1     1     1     1