【问题标题】:Using Unstack in Python在 Python 中使用 Unstack
【发布时间】:2015-06-05 03:09:31
【问题描述】:

我正在尝试在 python 中取消堆叠一列,但它并没有完全达到我的预期。我的表(称为 df)与此类似:

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

我想按年取消堆叠,以便每个站点一年中的所有天都排成一行。从 1916 年开始的两天将首先开始,然后是从 1917 年开始的 2 天,用于站 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'

任何帮助将不胜感激。

【问题讨论】:

    标签: python csv pandas


    【解决方案1】:

    您需要在调用 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'


    df 没有名为year 的索引级别(甚至,例如blah)时,df.unstack(level='year') 中的level='year' 会被忽略:

    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
    

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

    【讨论】:

    • 谢谢!我虽然这是一个问题,但我一直将 station_id 设为索引而不是年份。
    猜你喜欢
    • 2018-11-19
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2018-09-24
    • 2023-04-08
    • 1970-01-01
    • 2013-10-25
    • 2019-12-30
    相关资源
    最近更新 更多