2017-10-06 4 views
1

에 특정 월의 값과 조건에 따라 팬더 Dataframe 필터, 10900 집 값까지 Family_ids는 다릅니다. 따라서 데이터 프레임의 라인 수는 250 만 개가 넘습니다.나는 0에서 239으로 이동 다음 머리</p> <pre><code>import pandas as pd f = pd.Dataframe(columns=['month', 'Family_id', 'house_value']) </code></pre> <p>개월로 큰 dataframe이 다른 열

마지막 주택 가격과 각 가족마다 초기 값 사이에 차이가있는 경우에만 데이터 프레임을 필터링하고 싶습니다.

일부 샘플 데이터는 다음과 같이 보일 것이다 :

f = pd.DataFrame({'month': [0, 0, 0, 0, 0, 1, 1, 239, 239], 'family_id': [0, 1, 2, 3, 4, 0, 1, 0, 1], 'house_value': [10, 10, 5, 7, 8, 10, 11, 10, 11]}) 

그리고 그 샘플에서

는 결과 dataframe은 다음과 같습니다
g = pd.DataFrame({'month': [0, 1, 239], 'family_id': [1, 1, 1], 'house_value': [10, 11, 11]}) 

그래서 나는이 같은 것 코드에 생각 :

,536,913,632 :

ft = f[f.loc['month'==239, 'house_value'] > f.loc['month'==0, 'house_value']] 

또한이 시도 10

g = f[f.house_value[f.month==239] > f.house_value[f.month==0] and f.family_id[f.month==239] == f.family_id[f.month==0]] 

위의 코드는 오류 Keyerror: FalseValueError을 제공합니다. 감사.

+0

' 'month'== 239' 문자열을 비교하면'false'가되고'.loc'을 사용하여 색인에서'False'를 찾습니다. 따라서 키 오류가 발생합니다. 정확히 당신이 성취해야 할 것이 무엇입니까. 데이터를 게시 할 수 있습니까 – Dark

+2

두 시리즈의 길이가 다를 수 있으므로 그렇게 비교할 수 없습니다. 그래서 입력으로 샘플 데이터를 원하는 출력을 게시 – Dark

답변

4

사용 groupby.filter :

(f.sort_values('month') 
    .groupby('family_id') 
    .filter(lambda g: g.house_value.iat[-1] != g.house_value.iat[0])) 

# family_id house_value month 
#1   1    10  0 
#6   1    11  1 
#8   1    11  239 
@Bharath에 의해 주석으로

때문에 부울 필터에 대한 당신의 접근 방식 오류 아웃, 그것이 원래의 데이터 프레임과 동일한 길이를 가지고 부울 시리즈를 기대 비교 전에 적용한 필터 프로세스로 인해 두 경우 모두 사실이 아닙니다.

+0

고마워. 괜찮 았어. '.iat '는 무엇을 말하고 있는가? –

+0

Series 객체에서 요소를 가져 오는 'iloc'에 대한 빠른 대안입니다. 'iat [-1]'이 마지막 원소를 얻는 동안'iat [0]'은 시리즈의 첫 번째 원소를 얻는다. – Psidom

+0

@Psidom OP의 방법이 작동하지 않는 이유에 대한 대답을 내 의견을 추가 할 수 있습니다. – Dark