在Python中使用Unstack

时间:2015-03-31 17:05:19

标签: python csv pandas

我正在尝试在python中取消堆栈,但它并没有完全按照我的预期进行。我的表(称为df)看起来与此类似:

station_id   year     Day1   Day2 
 210018       1916      4        7
              1917      3        9 
 256700       1916     NaN       8
              1917      6        9

我想逐年拆散,以便每站一年的所有日子都在一排。从1916年开始的两天将首先开始,然后从1917年开始为210018和256700两天。

示例如下:

station_id            1916       1917
210018                4   7      3  9 
256700                NaN  8     6   9   

我正在尝试使用此代码:

df2=df.unstack(level='year')
df2.columns=df2.columns.swaplevel(0,1)
df2=df2.sort(axis=1)

我收到错误消息AttributeError: 'Series' object has no attribute 'columns'

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

您需要在调用unstack之前使year成为索引

try:
    # for Python2
    from cStringIO import StringIO 
except ImportError:
    # for Python3
    from io import StringIO

import pandas as pd


text = '''\
station_id   year     Day1   Day2 
 210018       1916      4        7
 210018       1917      3        9 
 256700       1916     NaN       8
 256700       1917      6        9'''

df = pd.read_table(StringIO(text), sep='\s+')
df = df.set_index(['station_id', 'year'])
df2 = df.unstack(level='year')
df2.columns = df2.columns.swaplevel(0,1)
df2 = df2.sort(axis=1)
print(df2)

产量

year       1916      1917     
           Day1 Day2 Day1 Day2
station_id                    
210018        4    7    3    9
256700      NaN    8    6    9

然而,如果year是一列而不是一个索引,那么

df = pd.read_table(StringIO(text), sep='\s+')
df = df.set_index(['station_id'])   
df2 = df.unstack(level='year')
df2.columns = df2.columns.swaplevel(0,1)
df2 = df2.sort(axis=1)

导致AttributeError: 'Series' object has no attribute 'columns'


level='year'没有名为df.unstack(level='year')的索引级别(或者说,df)时,year会忽略blah

In [102]: df
Out[102]: 
            year  Day1  Day2
station_id                  
210018      1916     4     7
210018      1917     3     9
256700      1916   NaN     8
256700      1917     6     9

In [103]: df.unstack(level='blah')
Out[103]: 
      station_id
year  210018        1916
      210018        1917
      256700        1916
      256700        1917
Day1  210018           4
      210018           3
      256700         NaN
      256700           6
Day2  210018           7
      210018           9
      256700           8
      256700           9
dtype: float64

这是令人惊讶的错误的来源。