我需要使用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
答案 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