首页 > 解决方案 > Pandas pivot_table 和额外的索引级别

问题描述

首先,我是唯一一个对 pivot_table 创建额外级别的索引/列名感到非常沮丧的人吗?我从来没有使用过 pivot_tables 并且想要除了平面数据框类型之外的任何东西,但是每次我使用它时,我都被迫重置索引、找出列名等。

这是一个示例,我有一个如下所示的数据框:

geography variable_type t0 t1 t2 t3
geo1      var1          1  3  4  8
geo1      var2          8  9  3  1
geo2      var1          4  7  9  4
geo2      var2          1  8  3  5

我想要完成的是:

geography time var1 var2
geo1      0    1    8
geo1      1    3    9
geo1      2    4    3
geo1      3    8    1
geo2      0    4    1
geo2      1    7    8
geo2      2    9    3
geo2      3    4    5

到目前为止我的代码:

pd.melt(df,id_vars=['geography','variable_type']).pivot_table(index=['geography','variable'],columns='variable_type')

这给了我一些东西,其中地理和变量看起来是索引,并且列似乎是不同的变量,但它们似乎有一个父级别的“值”和“variable_type”的名称。如果我像这样添加 reset_index() :

pd.melt(df,id_vars=['geography','variable_type']).pivot_table(index=['geography','variable'],columns='variable_type').reset_index()

然后我最终得到的变量仍然具有“variable_type”的名称和“value”的父级别,而索引已解析并且为 0-n。

所以我的问题是:

  1. 我该如何在此时此地解决这个问题?我想要一个看起来像 csv 或数据库表或任何其他普通数据框的平面数据框。
  2. 是否有另一种方法可以在不使用 pivot_table 的情况下执行此操作,或者使用 pivot_table 而不引入所有这些我十亿年来从未想要的新索引级别/名称?

标签: pythonpandasdataframetranspose

解决方案


添加values选项pivot_table和链rename_axis

df_final =  (pd.melt(df,id_vars=['geography','variable_type'])
               .pivot_table(index=['geography','variable'],columns='variable_type',values='value')
               .reset_index().rename_axis(None,axis=1))

Out[75]:
  geography variable  var1  var2
0      geo1       t0     1     8
1      geo1       t1     3     9
2      geo1       t2     4     3
3      geo1       t3     8     1
4      geo2       t0     4     1
5      geo2       t1     7     8
6      geo2       t2     9     3
7      geo2       t3     4     5

推荐阅读