2014-06-19 3 views
4

나는 이것과 저주를 못한다. 인터넷은 거의 도움이되지 못했다. 나는 팬더에서 일하고 있습니다. 그러나 이것은 timeseries 데이터를 효율적으로 저장하려고하는 사람들에게 일반적인 문제가되어야한다고 생각합니다.팬더 : 값의 변화를 가치 변화로 바꾸는 것

나는 값이 다음과 같이 자주 변경하는 일이 표준 매일 시계열 데이터를 많이 가지고

Date Value 01/02/2014 .1 01/03/2014 .1 01/04/2014 .5 01/05/2014 .5 01/06/2014 .5 01/07/2014 .1

난 단지 트랙 일에 데이터를 변환 할를 어디에 값이 변경되므로 위 예는 다음과 같아야한다 :

Date Value 01/02/2014 .1 01/04/2014 .5 01/07/2014 .1

불행히도 경우에 필요한 값을 삭제할 것 drop_duplicates() 같은 것을 사용하여 어디 값은 이전 값 (위의 예에서 .1과 같은)으로 되돌아갑니다.

답변

5

shiftall의 조합을 사용하여 여기서

In [98]: 

import io 
temp = """Date,Value 
01/02/2014,.1 
01/03/2014,.1 
01/04/2014,.5 
01/05/2014,.5 
01/06/2014,.5 
01/07/2014,.1""" 
df = pd.read_csv(io.StringIO(temp)) 
df 
Out[98]: 
     Date Value 
0 01/02/2014 0.1 
1 01/03/2014 0.1 
2 01/04/2014 0.5 
3 01/05/2014 0.5 
4 01/06/2014 0.5 
5 01/07/2014 0.1 

In [99]: 

df.loc[(df.shift() != df).all(axis=1)] 
Out[99]: 
     Date Value 
0 01/02/2014 0.1 
2 01/04/2014 0.5 
5 01/07/2014 0.1 

우리가 원래 dataframe와 시프트 (1 행에 의해) dataframe 비교를, 우리는 각 컬럼과 비교하고 all을 사용하여 달성 axis=1를 전달할 이.

또한 고장, 우리는 무엇을 df.shift() != df 돌아 보면 : 우리는 모든 행이 있는지 확인하려면 우리는 부울 값으로 dataframe를 얻을 수 있지만, 우리는 그대로 마스크로 사용할 수 없습니다

In [100]: 

df.shift() != df 
Out[100]: 
    Date Value 
0 True True 
1 True False 
2 True True 
3 True False 
4 True False 
5 True True 

True 그래서 우리는 all 사용

In [101]: 

(df.shift() != df).all() 
Out[101]: 
Date  True 
Value False 
dtype: bool 

그러나 기본적으로는 열이 우리가 axis=1을 통과하도록 행 값을 확인하려면, 모든 True을 것을 확인 :

,
In [102]: 

(df.shift() != df).all(axis=1) 
Out[102]: 
0  True 
1 False 
2  True 
3 False 
4 False 
5  True 
dtype: bool 

우리는 지금 우리가 원하는 것을 달성하기 위해 우리 부울 마스크로 사용할 수 있습니다 우리가 (어딘가에 아마 주요 문서) 요리 책이 추가하지만

In [103]: 

df.loc[(df.shift() != df).all(axis=1)] 
Out[103]: 
     Date Value 
0 01/02/2014 0.1 
2 01/04/2014 0.5 
5 01/07/2014 0.1 
+0

흠 .... 그걸하고 싶니? 이 – Jeff

+0

의 완벽한 예 @Jeff는이 답변에 대한 링크일까요? – EdChum

+0

작은 완전한 예제가 좋을 것이라고 생각합니다. (예를 들어 인라인 코드가 작은 경우 더 낫습니다) – Jeff

관련 문제