我正在尝试在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'
。
任何帮助都将不胜感激。
答案 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
这是令人惊讶的错误的来源。