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

Bartek Nowakowski

我有一个简单的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个数据帧以某种方式完成,但是我不确定如何开始。你能帮我吗?

耶斯列尔

使用经过修改的另一种解决方案,其中将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  

另一个想法是创建元组并分配新的列,这里MultiIndexMultiIndex.from_tuples

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)

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  

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章