Python-在列上具有多个索引的数据透视表

时间:2020-01-24 14:54:04

标签: python pandas dataframe

我有一个简单的df,如下所示:

           ID     Provider  Single_Cost    Bundle_ID  Bundle_Cost
0      L_0001         P_01       1075.0          NaN          NaN
1      L_0002         P_02        590.0          NaN          NaN
2      L_0003         P_02       6900.0          NaN          NaN
3      L_0004         P_02        625.0          NaN          NaN
4      L_0005         P_02       5775.0          NaN          NaN
5      L_0006         P_02        495.0          NaN          NaN
6      L_0007         P_02        570.0          NaN          NaN
7      L_0008         P_02       1250.0          NaN          NaN
8      L_0009         P_03       2940.0       P_03_1       1470.0
9      L_0010         P_03       7608.0       P_03_1       7308.0

我需要对其进行转换以获取2级列:

  • 第1级:提供商(提供商的数量各不相同)
  • 级别2:Single_CostBundle_IDBundle_Cost(所有提供商的3列恒定值)
     Provider  P_01                                 P_02                                 P_03
           ID  Single_Cost  Bundle_ID  Bundle_Cost  Single_Cost  Bundle_ID  Bundle_Cost  Single_Cost  Bundle_ID  Bundle_Cost
0      L_0001      1075.0         NaN          NaN          NaN       NaN           NaN          NaN       NaN           NaN
1      L_0002         NaN         NaN          NaN        590.0       NaN           NaN          NaN       NaN           NaN
2      L_0003         NaN         NaN          NaN       6900.0       NaN           NaN          NaN       NaN           NaN
3      L_0004         NaN         NaN          NaN        625.0       NaN           NaN          NaN       NaN           NaN
4      L_0005         NaN         NaN          NaN       5775.0       NaN           NaN          NaN       NaN           NaN
5      L_0006         NaN         NaN          NaN        495.0       NaN           NaN          NaN       NaN           NaN
6      L_0007         NaN         NaN          NaN        570.0       NaN           NaN          NaN       NaN           NaN
7      L_0008         NaN         NaN          NaN       1250.0       NaN           NaN          NaN       NaN           NaN
8      L_0009         NaN         NaN          NaN          NaN       NaN           NaN       2940.0    P_03_1        1470.0
9      L_0010         NaN         NaN          NaN          NaN       NaN           NaN       7608.0    P_03_1        7308.0

我认为可以在groupby之后合并2个数据帧以某种方式完成,但是我不确定如何开始。你能帮忙吗?

1 个答案:

答案 0 :(得分:3)

使用经过修改的another solution,并向pageOpts.member传递2列,最后重置set_index列,然后ID对其进行更正,rename在这里MultiIndex labels

(Provider, ID)

另一个想法是创建元组并分配新列,这里df = (df.set_index(['ID','Provider'], append=True) .unstack() .swaplevel(1, 0, axis=1) .sort_index(axis=1) .reset_index(level=1) .rename_axis((None, None), axis=1) .rename(columns={'':'ID'}) .rename(columns={'ID':'Provider'}, level=0)) print (df) Provider P_01 P_02 \ ID Bundle_Cost Bundle_ID Single_Cost Bundle_Cost Bundle_ID 0 L_0001 NaN NaN 1075.0 NaN NaN 1 L_0002 NaN NaN NaN NaN NaN 2 L_0003 NaN NaN NaN NaN NaN 3 L_0004 NaN NaN NaN NaN NaN 4 L_0005 NaN NaN NaN NaN NaN 5 L_0006 NaN NaN NaN NaN NaN 6 L_0007 NaN NaN NaN NaN NaN 7 L_0008 NaN NaN NaN NaN NaN 8 L_0009 NaN NaN NaN NaN NaN 9 L_0010 NaN NaN NaN NaN NaN P_03 Single_Cost Bundle_Cost Bundle_ID Single_Cost 0 NaN NaN NaN NaN 1 590.0 NaN NaN NaN 2 6900.0 NaN NaN NaN 3 625.0 NaN NaN NaN 4 5775.0 NaN NaN NaN 5 495.0 NaN NaN NaN 6 570.0 NaN NaN NaN 7 1250.0 NaN NaN NaN 8 NaN 1470.0 P_03_1 2940.0 9 NaN 7308.0 P_03_1 7608.0 MultiIndex.from_tuples

MultiIndex

df = (df.set_index(['ID','Provider'], append=True)
        .unstack()
        .swaplevel(1, 0, axis=1)
        .sort_index(axis=1)
        .reset_index(level=1)
        .rename_axis((None, None), axis=1))

mux = [('Provider', 'ID')] + df.columns.tolist()[1:]
df.columns = pd.MultiIndex.from_tuples(mux)