Re-arrange table 使用 Python
Re-arrange table using Python
我有一些 tables 展示了一些河流从 1893 年到 2010 年的每日流量值。不幸的是,tables 的组织方式很奇怪:
- 没有header,
- 有 13 列。第一个代表日期,接下来的代表月份(所以第 2 列 = 一月;第 3 列 = 二月;第四列 = 三月;等等,直到第 13 列 = 十二月),
- 表示日期的第一列总是从 1 到 31(表示一个月可以有 31 天)并不断重复直到拥有完整的时间序列(从 1893 年到 2010 年)。
作为一个最小的例子,以下仅代表 table 的前两年:
> 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 一起使用,以便 re-organize 仅在两列中显示数据;第一个代表天,第二个代表放电值。
您正在查找函数 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
- 每天都会独立地这样做(1
到 31
).
我有一些 tables 展示了一些河流从 1893 年到 2010 年的每日流量值。不幸的是,tables 的组织方式很奇怪:
- 没有header,
- 有 13 列。第一个代表日期,接下来的代表月份(所以第 2 列 = 一月;第 3 列 = 二月;第四列 = 三月;等等,直到第 13 列 = 十二月),
- 表示日期的第一列总是从 1 到 31(表示一个月可以有 31 天)并不断重复直到拥有完整的时间序列(从 1893 年到 2010 年)。
作为一个最小的例子,以下仅代表 table 的前两年:
> 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 一起使用,以便 re-organize 仅在两列中显示数据;第一个代表天,第二个代表放电值。
您正在查找函数 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
- 每天都会独立地这样做(1
到 31
).