使用Pandas取消堆栈数据

JD *_*ong 7 python pandas

我有一些数据,我从"长"到"宽".我使用unstack数据扩展没有问题,但后来我看起来像一个我无法摆脱的索引.这是一个虚拟的例子:

## set up some dummy data
import pandas as pd
d = {'state'  : ['a','b','a','b','a','b','a','b'],
     'year' : [1,1,1,1,2,2,2,2],
     'description'  : ['thing1','thing1','thing1','thing2','thing2','thing2','thing1','thing2'],
     'value' : [1., 2., 3., 4.,1., 2., 3., 4.]}
df = pd.DataFrame(d)
## now that we have dummy data do the long to wide conversion

dfGrouped = df.groupby(['state','year', 'description']).value.sum() 

dfUnstacked = dfGrouped.unstack('description')
print dfUnstacked


description  thing1  thing2
state year                 
a     1           4     NaN
      2           3       1
b     1           2       4
      2         NaN       6
Run Code Online (Sandbox Code Playgroud)

这看起来像我期望的那样.现在我想要一个带有列'state','year','thing1','thing2'的无索引数据框.所以我似乎应该这样做:

dfUnstackedNoIndex = dfUnstacked.reset_index()
print dfUnstackedNoIndex

description state  year  thing1  thing2
0               a     1       4     NaN
1               a     2       3       1
2               b     1       2       4
3               b     2     NaN       6
Run Code Online (Sandbox Code Playgroud)

好的,那很接近.但我不希望描述继续下去.所以我们只选择我想要的列:

print dfUnstackedNoIndex[['state','year','thing1','thing2']]

description state  year  thing1  thing2
0               a     1       4     NaN
1               a     2       3       1
2               b     1       2       4
3               b     2     NaN       6
Run Code Online (Sandbox Code Playgroud)

那么'描述'是怎么回事?为什么即使重置索引并只选择了几列,它也会挂出?显然,我没有正确的事情.

FWIW,我的Pandas版本是0.12

unu*_*tbu 6

description是列的名称.你可以这样摆脱:

In [74]: dfUnstackedNoIndex.columns.name = None

In [75]: dfUnstackedNoIndex
Out[75]: 
  state  year  thing1  thing2
0     a     1       4     NaN
1     a     2       3       1
2     b     1       2       4
3     b     2     NaN       6
Run Code Online (Sandbox Code Playgroud)

当您查看两次取消堆栈时发生的情况时,列名的用途可能会变得更清晰:

In [107]: dfUnstacked2 = dfUnstacked.unstack('state')
In [108]: dfUnstacked2
Out[108]: 
description  thing1      thing2   
state             a   b       a  b
year                              
1                 4   2     NaN  4
2                 3 NaN       1  6
Run Code Online (Sandbox Code Playgroud)

现在dfUnstacked2.columns是一个MultiIndex.每个level都有一个name对应于已转换为列级别的索引级别的名称.

In [111]: dfUnstacked2.columns
Out[111]: 
MultiIndex(levels=[[u'thing1', u'thing2'], [u'a', u'b']],
           labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
           names=[u'description', u'state'])
Run Code Online (Sandbox Code Playgroud)

列名和索引名称显示在DataFrames的字符串表示形式的相同位置,因此很难知道哪个是哪个.你可以通过检查df.index.names 和解决它df.columns.names.