我确信这是一个简单的长距离问题,但是当我有多个列在玩时,我无法正确理解如何处理此问题的语法。
我的数据如下:
>>> 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()
如何获取所需的格式?
答案 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)