Pandas Dataframe MultiIndex将多索引的一个级别转换为另一个轴,同时将另一个级别保持在原始轴上

时间:2018-06-12 14:25:30

标签: python pandas dataframe multi-index

我在行索引器中有一个带有Dataframe的Pandas MultiIndex,如下所示:

ES standard

此数据框是groupby操作的结果,然后从3级MultiIndex切片。我希望' date'要保留行索引器,但要移动' SlabType'行索引器的级别为列索引器,其中不可用的值为NaN

这就是我想要达到的目的:

enter image description here

我需要执行哪些操作才能实现此目的?此外,如果问题的标题可以改进,请提出建议。

2 个答案:

答案 0 :(得分:1)

unstack与选择列SlabLT一起使用:

print (df['SlabLT'].unstack())

但是如果可能的话MultiIndex中的重复是必要的聚合列,例如。 mean

print (df.groupby(level=[0,1])['SlabLT'].mean().unstack())

<强>示例

df = pd.DataFrame({'date':['2017-10-01','2017-10-08','2017-10-08','2017-10-15', '2017-10-15'],
                   'SlabType':['UOM2','AMOUNT','UOM2','AMOUNT','AMOUNT'],
                   'SlabLT':[1,6000,1,6000,5000]}).set_index(['date','SlabType'])

print (df)
                     SlabLT
date       SlabType        
2017-10-01 UOM2           1
2017-10-08 AMOUNT      6000
           UOM2           1
2017-10-15 AMOUNT      6000 <-duplicated MultiIndex '2017-10-15', 'AMOUNT'
           AMOUNT      5000 <-duplicated MultiIndex '2017-10-15', 'AMOUNT'

print (df['SlabLT'].unstack())
  

ValueError:索引包含重复的条目,无法重塑

print (df.groupby(level=[0,1])['SlabLT'].mean())
date        SlabType
2017-10-01  UOM2           1
2017-10-08  AMOUNT      6000
            UOM2           1
2017-10-15  AMOUNT      5500
Name: SlabLT, dtype: int64

print (df.groupby(level=[0,1])['SlabLT'].mean().unstack())
SlabType    AMOUNT  UOM2
date                    
2017-10-01     NaN   1.0
2017-10-08  6000.0   1.0
2017-10-15  5500.0   NaN

答案 1 :(得分:1)

由于某些条目的值为NaN,因此您可能需要考虑pivot table以避免重复条目&#34;取消堆栈其中一个索引时的ValueError。

假设您有df DataFrame,其列'SlabLT'的索引为dateSlabType,请尝试:

df.reset_index().pivot_table(values = 'SlabLT', index = 'date', columns = 'SlabLT')