在Python中使用Unstack

2024-10-04 13:26:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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站。在

示例如下:

^{pr2}$

我试图使用以下代码:

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

我得到一个错误,它说AttributeError: 'Series' object has no attribute 'columns'。在

任何帮助都将不胜感激。在


Tags: columnsid示例df堆栈nanyeardf2
1条回答
网友
1楼 · 发布于 2024-10-04 13:26:11

在调用unstack之前,year需要创建一个索引,然后调用unstack:

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)

收益率

^{pr2}$

然而,如果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)的索引级别时,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

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

相关问题 更多 >