在python中取消堆栈csv文件

时间:2015-03-02 01:41:58

标签: python pandas

我正在尝试在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

非常感谢任何帮助

1 个答案:

答案 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