使用Python重新排列表

时间:2016-06-07 13:42:01

标签: python pandas dataframe tabular

我有一些表格显示了从1893年到2010年的一些河流的每日排放值。不幸的是,这些表格的组织方式很奇怪:

  • 没有标题,
  • 有13列。第一个表示日期,下一个表示月份(因此第2列= 1月;第3列= 2月;第4列= 3月;依此类推,直到第13列= 12月),
  • 代表当天的第一列总是从1到31(代表一个月的31天)并重复直至完成时间序列(从1893年到2010年)。

作为一个最小的例子,以下仅代表表格的前两年:

> 1   4180    3400    3620    3250    5660    8910    30300   39400   27300   15700   9480    6260
> 2   4110    3310    3490    3080    6130    9530    26100   39400   32200   14400   10000   6090
> 3   4110    3250    3400    3110    8250    10200   22400   43200   32900   14500   11300   6090
> 4   4070    3190    3400    3190    7900    11100   28300   40100   30300   15000   11100   6090
> 5   4040    3110    3620    3310    7260    11600   29000   35200   28800   20300   11100   5960
> 6   3940    3110    3810    3490    6550    13900   27600   30600   28300   19900   11100   5660
> 7   3840    3110    3940    3750    6380    14700   26600   28400   25300   17600   11100   5540
> 8   3810    3020    3810    3750    6090    14900   25600   27300   31400   16900   10200   5380
> 9   3810    2990    3720    3720    7130    13500   28000   23100   36900   15700   9480    5260
> 10  3810    2990    3680    3680    9530    14600   34400   21500   33700   15100   8750    5110
> 11  3720    3110    3520    3650    8910    15600   40000   36900   28600   15400   8390    5000
> 12  3620    3110    3720    3590    6680    15700   41300   45200   25400   15400   7950    4880
> 13  3620    3190    4040    3560    6260    16700   39600   39400   22900   15000   7900    4760
> 14  3620    3190    4040    3560    5660    15100   36300   33700   20300   14300   7900    4620
> 15  3720    3190    4180    3720    5260    13900   33700   30600   18300   14100   7760    4620
> 16  3810    3220    4040    3840    7760    13900   32900   27600   21100   13900   7760    4510
> 17  3810    3220    4040    3940    10500   13900   35600   25100   20300   12700   7000    4180
> 18  3720    3310    3840    4140    8750    20300   35000   24400   18900   12700   7460    4470
> 19  3620    3310    3720    4260    7410    22200   32400   23200   16500   13400   7900    4400
> 20  3490    3280    3520    5220    6830    21000   27500   27600   14700   13900   7760    4370
> 21  3490    3220    3520    6830    6510    20300   23100   30600   13900   14100   8250    4330
> 22  3490    3130    3520    7000    7410    17900   20900   25800   13400   12800   7900    4260
> 23  3490    3080    3520    6130    7600    15100   22200   22500   12800   12200   7900    4180
> 24  3490    3130    3840    5660    7310    15100   20700   20300   12200   11600   7500    4040
> 25  3400    3160    4290    5300    8000    14500   17200   18300   12200   11100   7900    4040
> 26  3310    3340    4400    5110    8390    14500   17600   17600   12700   10600   7410    4010
> 27  3310    3460    4290    5000    7900    13900   19000   19600   15000   10500   6830    3970
> 28  3400    3620    4040    4910    8390    19600   34500   20300   16300   10600   6510    3970
> 29  3490    0000    3810    4880    8490    29900   43500   20300   17200   10300   6380    3940
> 30  3520    0000    3520    4910    9430    31800   42700   20300   17200   10000   6260    3840
> 31  3490    0000    3400    0000    8800    0000    41500   23900   0000    9920    0000    3880
> 1   3880    3430    3220    4910    11500   14400   25100   18300   19100   29800   16900   7460
> 2   3880    3400    3490    4760    12200   15600   19200   17200   21500   27600   16900   7260
> 3   3840    3370    3460    4180    11600   15700   16900   21500   24200   25300   15700   7260
> 4   3840    3310    3490    4040    10000   19200   15700   29100   22900   23600   15000   6960
> 5   3840    3250    3810    3840    8910    25100   19000   28000   20000   23200   13900   6830
> 6   3910    3220    3840    3750    8440    21200   26400   22000   16900   29800   13400   6550
> 7   3880    3190    3720    3620    8440    17400   32600   19400   16000   34800   12700   6380
> 8   3840    3190    3780    3520    10900   15100   25400   16900   15600   32900   12200   6130
> 9   3810    3190    3840    3840    10200   16200   20200   17200   17600   27500   12200   6130
> 10  3750    3190    4010    4140    8960    15100   17600   21800   21800   23900   12200   6090
> 11  3680    3190    4070    4180    8910    14400   15600   27500   20700   21000   11900   5960
> 12  3650    3190    3940    4140    11600   12800   13900   22700   20000   18900   11100   5960
> 13  3620    3190    3810    4040    10600   12000   14500   20300   18700   16900   10900   5700
> 14  3560    3430    3720    3970    9800    16900   14400   20500   17200   15700   10300   5540
> 15  3520    3460    3810    3840    11600   19400   12200   25600   17600   15100   9800    5300
> 16  3490    3310    3940    3810    11300   19400   10800   27500   18300   15400   9270    5340
> 17  3490    3250    3840    3720    11700   15100   9590    23200   19600   16900   8960    5700
> 18  3400    3190    3810    3840    13500   16000   9170    19900   21500   22500   8850    5780
> 19  3370    3160    3810    4910    12800   15700   10100   17600   21700   23100   8440    5620
> 20  3310    3110    3840    7460    13400   15800   11300   15800   21500   21800   8440    5380
> 21  3280    3080    3970    7760    16300   15100   12800   16200   20900   20800   8960    5300
> 22  3220    3080    4180    7460    17600   15700   12800   15000   27600   20300   8750    5150
> 23  3220    3050    4140    11500   16900   24900   19600   13900   31200   23200   8440    5150
> 24  3190    2990    4010    13900   15200   25400   25800   13900   29900   23900   8440    5150
> 25  3190    3020    4110    10300   13900   21000   20300   13400   30300   22500   8250    5000
> 26  3190    3050    4180    8340    13300   17600   15500   12400   30300   21700   7900    4880
> 27  3310    3020    5700    7260    11600   15700   13400   12200   29100   21700   7600    4760
> 28  3520    3080    10600   6830    10500   14500   12500   14300   27600   21800   7410    4760
> 29  3620    0000    9480    9270    11700   19600   11400   17900   27500   20700   7260    4550
> 30  3520    0000    6830    10300   12700   27900   11100   29400   30100   19000   7410    4510
> 31  3490    0000    5540    0000    13900   0000    13400   25700   0000    17600   0000    4510

这个数据框不太方便。因此,我很高兴知道我可以使用哪个函数与python,以便只在两列中重新组织数据;第一个代表当天,第二个代表放电价值。

1 个答案:

答案 0 :(得分:1)

您正在寻找功能melt。让我们先重命名列:

df.columns = ['day', 'Jan', 'Feb', ..., 'Dec']

然后您可以融合数据框:

In [65]: pd.melt(df, id_vars=['day'], var_name='month')
Out[65]: 
    day  month   value
0     1    Jan  4180.0
1     2    Jan  4110.0
2     3    Jan  4110.0
3     4    Jan  4070.0
4     5    Jan  4040.0
5     6    Jan  3940.0
6     7    Jan  3840.0
...

修改:如评论中所述,您还需要一个包含年份的列。我确定还有其他方法,但我建议使用GroupBy.cumcount

df['year'] = df.groupby('day').cumcount() + 1893

每当您遇到某一天时,计数会增加1,并且 - 由于使用groupby - 每天都会独立完成(131)。