pandas 将多索引 Dataframe 索引列转换或转置为标头标识符

lxkprmvk  于 2022-12-16  发布在  其他
关注(0)|答案(2)|浏览(229)

我目前有一个多索引 Dataframe ,其中两列充当索引,列“日期”和“产品”。另外两列充当值,列“销售额”、“成本”。但是,我想将其中一个索引列转换为标题标识符,而另一个索引列充当行标识符。
df2 = pd.DataFrame({'Date':['10-31','10-31','10-31','12-31','12-31','12-31'],'Product':['Apple','Pear','Banana','Apple','Pear','Banana'], 'Sales':[1, 0.8, 1.2, 2, 0.9, 1.7], 'Cost':[0.5, 0.3, 0.6, 0.4, 0.4, 0.7]})
正在将“日期”和“产品”设置为索引列:
(['日期','产品'],inplace=真)
df2 ′
多索引 Dataframe 如下所示:
| 日期|产品|销售额|费用|
| - ------|- ------|- ------|- ------|
| 十至三十一|苹果|1个|0.5分|
| | 梨|0.8分|0.3分|
| | 香蕉|第1.2条|0.6分|
| 十二至三十一|苹果|第二章|0.4分|
| | 梨|0.9个单位|0.4分|
| | 香蕉|1.7岁|0.7分|
但是我想将'Product'索引列转置为标题标识符,同时仍然保留'Data'索引列作为行标识符。

| Apple              | Pear               | Banana   |

| 日期|销售额|费用|销售额|费用|销售额|费用|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 十至三十一|1个|0.5分|0.8分|0.3分|第1.2条|0.6分|
| 十二至三十一|第二章|0.4分|0.9| 0.4分|1.7岁|0.7分|

mznpcxlj

mznpcxlj1#

DataFrame.set_indexDataFrame.unstack一起使用,然后按DataFrame.swaplevel交换MultiIndex的级别,并按DataFrame.sort_indexMultiIndex进行排序,其中第一个级别为:

df2 = pd.DataFrame({'Date':['10-31','10-31','10-31','12-31','12-31','12-31'],'Product':['Apple','Pear','Banana','Apple','Pear','Banana'], 'Sales':[1, 0.8, 1.2, 2, 0.9, 1.7], 'Cost':[0.5, 0.3, 0.6, 0.4, 0.4, 0.7]})
df = (df2.set_index(['Date', 'Product'])
      .unstack()
      .swaplevel(0,1, axis=1)
      .sort_index(axis=1, level=0, sort_remaining=False))
print (df)
Product Apple      Banana       Pear     
        Sales Cost  Sales Cost Sales Cost
Date                                     
10-31     1.0  0.5    1.2  0.6   0.8  0.3
12-31     2.0  0.4    1.7  0.7   0.9  0.4
xpcnnkqh

xpcnnkqh2#

示例

data = [[1.0, 0.5], [0.8, 0.3], [1.2, 0.6], [2.0, 0.4], [0.9, 0.4], [1.7, 0.7]]
idx = pd.MultiIndex.from_product([['10-31', '12-31'], ['Apple', 'Pear', 'Banana']])
df2 = pd.DataFrame(data, columns=['Sales', 'Cost'], index=idx)

df2

Sales   Cost
10-31   Apple   1.0     0.5
        Pear    0.8     0.3
        Banana  1.2     0.6
12-31   Apple   2.0     0.4
        Pear    0.9     0.4
        Banana  1.7     0.7

代码

(df2.unstack().swaplevel(0, 1, axis=1).sort_index(axis=1)
.reindex(columns=['Sales', 'Cost'], level=1))

结果

Product Apple           Banana          Pear
        Sales   Cost    Sales   Cost    Sales   Cost
Date                        
10-31   1.0     0.5     1.2     0.6     0.8     0.3
12-31   2.0     0.4     1.7     0.7     0.9     0.4

相关问题