我有一些数据,我从“长”到“宽”。使用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
所以这看起来像我期望的那样。现在我想要一个带有列'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
好的,那很接近。但我不希望描述继续下去。所以我们只选择我想要的列:
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
那么'描述'是什么?为什么即使重置索引并只选择了几列,它也会挂出?显然,我没有正确的事情。
FWIW,我的Pandas版本是0.12
答案 0 :(得分: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
当您查看两次取消堆栈时会发生什么时,列名的用途可能会变得更清晰:
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
现在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'])
列名称和索引名称显示在DataFrames的字符串表示形式的相同位置,因此很难知道哪个是哪个。您可以通过检查df.index.names
和df.columns.names
来解决这个问题。