pandas:如何透过具有已定义级别的表

时间:2017-07-20 10:48:56

标签: python pandas pivot

我的情况与我迄今为止在网上发现的情况略有不同。我想在标题中使用特定级别来转动pandas数据帧。 pivot_table函数要求值为数字,pandas.pivot函数似乎没有完全符合我的要求。

这是起始代码。

import pandas as pd
df = pd.DataFrame({'session':['2017', '2018','2017','2018','2017','2018'], 'domain':['network', 'network', 'facility', 'facility', 'access', 'access'], 'vendor':['vendorA', 'vendorA', 'vendorB','vendorB','vendorB','vendorB'], 'cost':[10,20,30,40,50,60]})
print df.to_string()
   cost    domain session   vendor
0    10   network    2017  vendorA
1    20   network    2018  vendorA
2    30  facility    2017  vendorB
3    40  facility    2018  vendorB
4    50    access    2017  vendorB
5    60    access    2018  vendorB

我所追求的是类似的东西,第一列级别只有'域'值,第二列级别'供应商'和'成本'对于每个域'会话':

domain   network        facility       access 
session  vendor   cost  vendor   cost  vendor   cost
2017     vendorA  10    vendorB  30    vendorB  50
2018     vendorA  20    vendorB  40    vendorB  60

1 个答案:

答案 0 :(得分:1)

您可以使用set_index + unstack进行重塑,然后使用MultiIndex中的swaplevel列,最后按sort_index排序:

df1 = df.set_index(['session','domain'])
        .unstack()
        .swaplevel(0,1,1)
        .sort_index(1, ascending=False)
print (df1)
domain   network      facility        access     
          vendor cost   vendor cost   vendor cost
session                                          
2017     vendorA   10  vendorB   30  vendorB   50
2018     vendorA   20  vendorB   40  vendorB   60

或者使用pivot

df1 = df.pivot(index='session',columns='domain')
        .swaplevel(0,1,1)
        .sort_index(1, ascending=False)
print (df1)
domain   network      facility        access     
          vendor cost   vendor cost   vendor cost
session                                          
2017     vendorA   10  vendorB   30  vendorB   50
2018     vendorA   20  vendorB   40  vendorB   60