从数据框列

时间:2017-06-02 21:12:59

标签: python date pandas dataframe

我有一个这样的数据框:

Ind TIME  PREC  ET    PET   YIELD
0      1  1.21  0.02  0.02   0.00
1      2  0.00  0.03  0.04   0.00
2      3  0.00  0.03  0.05   0.00
3      4  0.00  0.04  0.05   0.00
4      5  0.00  0.05  0.07   0.00
5      6  0.00  0.03  0.05   0.00
6      7  0.00  0.02  0.04   0.00
7      8  1.14  0.03  0.04   0.00
8      9  0.10  0.02  0.03   0.00
9     10  0.00  0.03  0.04   0.00
10    11  0.10  0.05  0.11   0.00
11    12  0.00  0.06  0.15   0.00
12    13  2.30  0.14  0.44   0.00
13    14  0.17  0.09  0.29   0.00
14    15  0.00  0.13  0.35   0.00
15    16  0.00  0.14  0.39   0.00
16    17  0.00  0.10  0.31   0.00
17    18  0.00  0.15  0.51   0.00
18    19  0.00  0.22  0.58   0.00
19    20  0.10  0.04  0.09   0.00
20    21  0.00  0.04  0.06   0.00
21    22  0.27  0.13  0.43   0.00
22    23  0.00  0.10  0.25   0.00
23    24  0.00  0.03  0.04   0.00
24    25  0.00  0.04  0.05   0.00
25    26  0.43  0.04  0.15   0.00
26    27  0.17  0.06  0.23   0.00
27    28  0.50  0.02  0.04   0.00
28    29  0.00  0.03  0.04   0.00
29    30  0.00  0.04  0.08   0.00
30    31  0.00  0.04  0.08   0.00
31     1  6.48  1.97  5.10   0.03
32    32  0.00  0.22  0.70   0.00
33    33  0.00  0.49  0.88   0.00

在此数据框列中,'TIME'显示一年中的序号日数,以及每月结束后 - 一年中的序数月份,这会扰乱所有数据框计算,因此,我想删除包含月份值的所有行。首先,我尝试使用.shift()

df = df.loc[df.TIME == df.TIME.shift() +1]

然而,在这种情况下,我删除的行数是它应该的两倍。我还尝试在每个月结束后删除每个值:

for i in indexes:
    df = df.loc[df.index != i],

其中indexes是一个列表,包含日值之后的行索引等于31,59,... 365或每月结束。但是,在闰年,这些值会有所不同,我可以为闰年创建另一个列表,但这种方法非常非蟒蛇。所以,我想知道,有没有更好的方法从数据帧中删除非连续值(不包括一年结束而另一年开始:364,365,1,2)? 编辑:我可能会补充说,这个数据框中有二十年,所以这就是每年年底数据帧的样子:

TIME PREC ET PET YIELD 370 360 0.00 0.14 0.26 0.04 371 361 0.00 0.15 0.27 0.04 372 362 0.00 0.14 0.25 0.04 373 363 0.11 0.18 0.32 0.04 374 364 0.00 0.15 0.25 0.04 375 365 0.00 0.17 0.29 0.04 376 12 16.29 4.44 7.74 1.89 377 1 0.00 0.16 0.28 0.03 378 2 0.00 0.18 0.32 0.03 379 3 0.00 0.22 0.40 0.03

2 个答案:

答案 0 :(得分:2)

df

    TIME   PREC    ET   PET  YIELD
0    360   0.00  0.14  0.26   0.04
1    361   0.00  0.15  0.27   0.04
2    362   0.00  0.14  0.25   0.04
3    363   0.11  0.18  0.32   0.04
4    364   0.00  0.15  0.25   0.04
5    365   0.00  0.17  0.29   0.04
6     12  16.29  4.44  7.74   1.89
7      1   1.21  0.02  0.02   0.00
8      2   0.00  0.03  0.04   0.00
9      3   0.00  0.03  0.05   0.00
10     4   0.00  0.04  0.05   0.00
11     5   0.00  0.05  0.07   0.00
12     6   0.00  0.03  0.05   0.00
13     7   0.00  0.02  0.04   0.00
14     8   1.14  0.03  0.04   0.00
15     9   0.10  0.02  0.03   0.00
16    10   0.00  0.03  0.04   0.00
17    11   0.10  0.05  0.11   0.00
18    12   0.00  0.06  0.15   0.00
19    13   2.30  0.14  0.44   0.00
20    14   0.17  0.09  0.29   0.00
21    15   0.00  0.13  0.35   0.00
22    16   0.00  0.14  0.39   0.00
23    17   0.00  0.10  0.31   0.00
24    18   0.00  0.15  0.51   0.00
25    19   0.00  0.22  0.58   0.00
26    20   0.10  0.04  0.09   0.00
27    21   0.00  0.04  0.06   0.00
28    22   0.27  0.13  0.43   0.00
29    23   0.00  0.10  0.25   0.00
30    24   0.00  0.03  0.04   0.00
31    25   0.00  0.04  0.05   0.00
32    26   0.43  0.04  0.15   0.00
33    27   0.17  0.06  0.23   0.00
34    28   0.50  0.02  0.04   0.00
35    29   0.00  0.03  0.04   0.00
36    30   0.00  0.04  0.08   0.00
37    31   0.00  0.04  0.08   0.00
38     1   6.48  1.97  5.10   0.03
39    32   0.00  0.22  0.70   0.00
40    33   0.00  0.49  0.88   0.00

查看TIME中的差异。删除diff在-360和-1之间的行

df[~df.TIME.diff().le(-12)]

    TIME  PREC    ET   PET  YIELD
0    360  0.00  0.14  0.26   0.04
1    361  0.00  0.15  0.27   0.04
2    362  0.00  0.14  0.25   0.04
3    363  0.11  0.18  0.32   0.04
4    364  0.00  0.15  0.25   0.04
5    365  0.00  0.17  0.29   0.04
7      1  1.21  0.02  0.02   0.00
8      2  0.00  0.03  0.04   0.00
9      3  0.00  0.03  0.05   0.00
10     4  0.00  0.04  0.05   0.00
11     5  0.00  0.05  0.07   0.00
12     6  0.00  0.03  0.05   0.00
13     7  0.00  0.02  0.04   0.00
14     8  1.14  0.03  0.04   0.00
15     9  0.10  0.02  0.03   0.00
16    10  0.00  0.03  0.04   0.00
17    11  0.10  0.05  0.11   0.00
18    12  0.00  0.06  0.15   0.00
19    13  2.30  0.14  0.44   0.00
20    14  0.17  0.09  0.29   0.00
21    15  0.00  0.13  0.35   0.00
22    16  0.00  0.14  0.39   0.00
23    17  0.00  0.10  0.31   0.00
24    18  0.00  0.15  0.51   0.00
25    19  0.00  0.22  0.58   0.00
26    20  0.10  0.04  0.09   0.00
27    21  0.00  0.04  0.06   0.00
28    22  0.27  0.13  0.43   0.00
29    23  0.00  0.10  0.25   0.00
30    24  0.00  0.03  0.04   0.00
31    25  0.00  0.04  0.05   0.00
32    26  0.43  0.04  0.15   0.00
33    27  0.17  0.06  0.23   0.00
34    28  0.50  0.02  0.04   0.00
35    29  0.00  0.03  0.04   0.00
36    30  0.00  0.04  0.08   0.00
37    31  0.00  0.04  0.08   0.00
39    32  0.00  0.22  0.70   0.00
40    33  0.00  0.49  0.88   0.00

答案 1 :(得分:1)

df[df['TIME'].shift().fillna(0) <= df['TIME']]

给你想要的东西。

你几乎就在那里
df.loc[df.TIME == df.TIME.shift() +1]

但是你不需要摆脱.shift较小的情况,因为这只是本月的第一天。

添加.fillna(0)会处理NaN第一行中的df['TIME'].shift()

修改

对于今年年底的情况,只要确保那些差异为11的人,赶上第12个月结束的地方。 那会给出

df[(df['TIME'].shift().fillna(0) <= df['TIME']+11)]

<强> EDIT2: 顺便说一句,我检查了解决方案运行时,@ piRSquared的当前版本(df[~df.TIME.diff().le(-12)])似乎运行得最快。

为完整起见,本文中提供的内容和@piRSquared发布的原始版本, 前者在10000行或更少的数据集上快一点,后者在那些更大的行上稍快一些。