python - 使用 Pandas 拆分数据

标签 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

所以这看起来像我期望的那样。现在我想要一个未索引的数据框,其中包含“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

最佳答案

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'])

列名称和索引名称在 DataFrame 的字符串表示形式中出现在同一位置,因此很难分清哪个是哪个。您可以通过检查 df.index.namesdf.columns.names 来弄清楚。

关于python - 使用 Pandas 拆分数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20847508/

相关文章:

python - Pandas 作为 Flask 应用程序的快速数据存储

python - Pandas 合并而不复制列

python - 在 Pandas 中将文本转换为 int64 分类

python - Numpy 向量化 : Find intersection between list and list of lists

python OCR : Converting Scanned Image Into Text For Processing

python - '{ :08b}' . format(i) 等效于 Python 2.x

datetime - 圆形 Pandas 日期时间索引?

python - 如何使用python自动通过网络发送文件?

python - Plotly:如何使用 Pandas 数据框作为源按行填充表

python - 如何在保留列的同时找到累积计数行之间的差异