2015-01-27 11 views
1

내가 이런 값의 누적 시리즈가 누적 일련의 스파이크에 대한 필터를 잘라 :파이썬, 팬더 :

1821, 2015-01-26 22:14:42+02:00, 24574.7 
1822, 2015-01-26 22:15:05+02:00, 24574.7 
1823, 2015-01-26 22:15:28+02:00, 24574.8 
1824, 2015-01-26 22:15:49+02:00, 24574.9 
1825, 2015-01-26 22:16:11+02:00, 24574.9 
1826, 2015-01-26 22:16:34+02:00, 24576.0 
1828, 2015-01-26 22:17:19+02:00, 24575.1 
1829, 2015-01-26 22:17:41+02:00, 24575.2 
1830, 2015-01-26 22:18:03+02:00, 24575.3 
1831, 2015-01-26 22:18:25+02:00, 24575.3 

문제는 가끔이 일련의 정상하지 않은 값을 얻을 수 있다는 것입니다 누적 및 값만 증가해야합니다. 1826 년과 마찬가지로 (값은 24576이고 그 다음 값은 더 작음). Pandas Series 객체에서이 값을 제거하는 방법이 있습니까? 나는. 값이 이전 및 다음 값보다 클 때?

답변

1

는이 diff 방법으로서 내장있다 :

In [30]: 

pd.concat([df.head(1), df[df['cumulative value'].diff()>=0]]) 
Out[30]: 
       timestamp cumulative value 
0           
1821 2015-01-26 20:14:42   24574.7 
1822 2015-01-26 20:15:05   24574.7 
1823 2015-01-26 20:15:28   24574.8 
1824 2015-01-26 20:15:49   24574.9 
1825 2015-01-26 20:16:11   24574.9 
1826 2015-01-26 20:16:34   24576.0 
1829 2015-01-26 20:17:41   24575.2 
1830 2015-01-26 20:18:03   24575.3 
1831 2015-01-26 20:18:25   24575.3 

편집 여기 diff 호출 지적 첫 번째 행을 잃어 버려 내가 처음 행을 연결하여의 결과와 첫 행을 연결하면 추한 해킹이 발생합니다. 따라서 첫 행을 잃지 않습니다.

+0

첫 번째 행을 삭제하는 것처럼 'diff'를 사용하십시오. – andrew

+0

@andrew 예, 맞습니다. 업데이트하겠습니다. – EdChum

2

근접 차이를 계산하려면 np.diff()을 사용할 수 있습니다. 그 차이가 음수라면 이전 행을 제거해야한다는 것을 알고 있습니다.

1

이 작업은 Pandas 'boolean indexing을 사용하는 한 줄 솔루션으로 수행 할 수 있습니다. 하나의 라이너는 팬더의 mapdiff 방법과 lambda 기능을 사용합니다. map은 모든 행에 lambda 함수를 적용하는 데 사용됩니다. NaN 값을 True로 평가할 사용자 정의 Less-then 비교를 작성하려면 lambda 함수가 필요합니다.

다음 예는 설명합니다.

면책 조항 : 이것은 모든 행이 항상 이전 두 행보다 크거나 같다고 가정 할 수있는 경우에만 작동합니다. 다른 말로 : 행 [I]> = 로우 [I-2]

import pandas as pd 
df = pd.DataFrame({'A':['a','b','c','d','e', 'f', 'g'], 'B': [1,2,2,4,3,5,6]}) 

# We're going to use Pandas' diff method, telling it to take the difference 1 row back. 
print df['B'].diff(1) 

# Createa boolean index. We use map and a lambda function to handle the tricky case of the first row evaluating to 
print df['B'].diff(1).map(lambda x: not(x<0)) 

# Here is the one line solution! 
# Redefine df to only contain the rows that behave themselves. 
df = df[df['B'].diff(1).map(lambda x: not(x<0))] 

print df