2017-06-02 83 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