我正在尝试在python中取消堆栈,但它并没有完全按照我的预期进行。我的表看起来与此类似:
Station_id year month Day1 Day2
210018 1916 1 4 7
2 6 NaN
3 2 1
256700 1917 1 NaN 8
2 6 9
3 2 0
我想按月拆散,以便一个月内的所有日子都在一排。从第一个月开始的两天将首先开始,然后是从第二个月开始的2天,然后是从第三个月开始的两天,依此类推。在此之后我不再需要月份列,我尝试删除它并取消堆叠,但它不会起作用。
表格如下所示:
Station_id year
210018 1916 4 7 6 NaN 2 1
256700 1917 NaN 8 6 9 2 0
当我立即尝试df.unstack(2)
时,它会返回如下所示的结果:
Station_id year
210018 1916 4 6 2 7 NaN 1
256700 1917 NaN 6 2 8 9 0
非常感谢任何帮助
答案 0 :(得分:2)
大熊猫正在做什么并没有错。您只需要交换一些列级别然后对它们进行排序。
获取你的数据并制作一个可重现的例子(python 3),你得到了这个:
from io import StringIO
import pandas
datafile = StringIO("""\
Station_id year month Day1 Day2
210018 1916 1 4 7
210018 1916 2 6 NaN
210018 1916 3 2 1
256700 1917 1 NaN 8
256700 1917 2 6 9
256700 1917 3 2 0
""")
df = pandas.read_table(datafile, sep='\s+', engine='python',
index_col=['Station_id', 'year', 'month'])
print(df.unstack(level='month'))
Day1 Day2
month 1 2 3 1 2 3
Station_id year
210018 1916 4 6 2 7 NaN 1
256700 1917 NaN 6 2 8 9 0
在你的心目中,你认为几个月是最合乎逻辑的,但你已经给了大熊猫没有办法知道这是有意义的。所以你必须自己做:
df = pandas.read_table(datafile, sep='\s+', engine='python',
index_col=['Station_id', 'year', 'month'])
xtab = df.unstack(level='month')
xtab.columns = xtab.columns.swaplevel(0, 1)
xtab = xtab.sort(axis=1)
print(xtab)
month 1 2 3
Day1 Day2 Day1 Day2 Day1 Day2
Station_id year
210018 1916 4 7 6 NaN 2 1
256700 1917 NaN 8 6 9 2 0