2017-06-02 77 views
1

删除非连续的值,我有这样一个数据帧:从数据帧列

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或每个月的月底。但是,在闰年中,这些值会有所不同,并且我可以为闰年创建另一个列表,但此方法非常非pythonist。所以,我想知道,是否有更好的方法从数据框中删除非连续值(不包括一年结束,另一个开始: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

回答

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

使你在找什么。你几乎有与

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

但你并不需要摆脱地方.shift较小的情况下,因为这只是第一个月的。

df['TIME'].shift()的第一行中增加.fillna(0)负责NaN

编辑:

对于今年案件结束,只是一定要还采取那些拥有11的差异,赶在12月结束。 这将使

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

EDIT2: 顺便提一下,我检查了解决方案的运行时间,并@ piRSquared的当前版本(df[~df.TIME.diff().le(-12)])似乎跑的最快。

为了完整,本文提交的内容和@piRSquared发布的原始版本, 前者在10000行或更少的数据集上速度稍快,后者在较大的数据集上稍快。

+0

但是,此方法也适用,因为在@piRSquared解决方案中,一年中第一天的行消失。 –

+0

谢谢,@EFT。 “<=”是什么意思? –

+0

小于或等于。 – EFT

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 

看的diff文件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 
+0

这是一个很好的简短解决方案,但我需要完全相反的:删除月份并仅保留天数。所以,这个:'df [df.TIME.diff()。(1,366)]之间的作品,但是,一年中第一天的所有行也会被删除。 –

+1

包括今年头一年的数据。 – piRSquared

+0

@SergeyGulbin'〜'很重要,否定选择。不过,发表在你评论中的版本更直截了当。 – EFT