大熊猫的MultiIndex枢纽,从长到宽的问题

时间:2019-01-02 23:17:31

标签: pandas pandas-groupby

我确信这是一个简单的长距离问题,但是当我有多个列在玩时,我无法正确理解如何处理此问题的语法。

我的数据如下:

>>> df.head()
        s_name   geo    zip  date value
0        A002X   zip  00601  2010     1
1        A002Y   zip  00601  2010     2
2        A003X   zip  00601  2010     3
3        A003Y   zip  00601  2010     4
...
.        A002X   zip  00602  2010     8
.        A002Y   zip  00602  2010     9
.        A003X   zip  00602  2010    10
.        A003Y   zip  00602  2010    11

我希望它看起来像这样,即s_name列的内容变为新列,并且它们的值是“值”列,并按(geo,zip,date)分组:

>>> df2.head()
         A002X A002Y A003X A003Y     geo    zip  date
0            1     2     3     4     zip  00601  2010
1            8     9    10    11     zip  00602  2010
2           19    20    21    22     zip  00603  2010
3           31    32    33    45     zip  00604  2010

我尝试过这样的情侣

>>> df.pivot(columns='s_name', values=["geo","zip","date","value"])

>>> df.pivot(columns='s_name', values=["geo","zip","date","value"]).unstack().reset_index()

我觉得我真的很接近,但是似乎没有任何匹配。例如,这会删除多余的non-s_name值:

>>> df.pivot(columns='name', values=["value"]).head()

如何获取所需的格式?

2 个答案:

答案 0 :(得分:3)

我将做什么pivot_table

s=df.pivot_table(index=['geo','zip','date'],columns='s_name',values='value',aggfunc='sum')
s
s_name        A002X  A002Y  A003X  A003Y
geo zip date                            
zip 601 2010      1      2      3      4
    602 2010      8      9     10     11
#s=s.reset_index()

答案 1 :(得分:2)

有必要将维度设置为索引,然后将所需的维度拆为列

这将在最终输出中保留一个多索引

示例:

# with df as the following
  s_name  geo  zip  date  value
0  A002X  zip  601  2010      1
1  A002Y  zip  601  2010      2
2  A003X  zip  601  2010      3
3  A003Y  zip  601  2010      4

ids = df.columns[:-1].tolist()
df2 = df.set_index(ids).unstack(0)
df2
# outputs:
             value                  
s_name       A002X A002Y A003X A003Y
geo zip date                        
zip 601 2010     1     2     3     4

然后将多索引变平,保持第二级:

df2.columns = df2.columns.get_level_values(1)