2017-10-27 2 views
1

나에게 또 다른 도전적인 질문이지만 아마도 쉬운 문제 일 것입니다. 나는 비단식으로 생각하는 법을 모른다.Python Dataframe : 다른 열의 값을 비교하여 한 열의 데이터 정리

나는 데이터 프레임이 있습니다

dt={'Name':['A','A','B','B','C','D','D'],'FG':['N','Y','N','Y','N','N','N'], 'Date':[2016,2017,2017,2016,2017,2017,2017]} 

DF = pd.DataFrame (데이터 = DT는, 열 = [ '이름', 'FG', '날짜']) 내가 원하는 무엇

"FG"의 플래그 값을 "Names"(반복 가능)의 각 이름에 대해 "Y"로 설정하고 해당 날짜가 "N"과 연결된 날짜보다 큰지 확인하십시오. 그렇지 않으면 내가 떨어 뜨릴 것이다. 경험 부족으로이 코드를 작성하는 방법을 생각할 수 없습니다. 여기 시각화하는 것은 내가 여기

Name FG Date 
A  N 2016 
A  Y 2017 
B  N 2017 
B  Y 2016 
C  Y 2017 
D  N 2017 
D  N 2017 

내가 한 번 더 열이 그룹 내에서 max 값을 복원 추가

Name FG Date 
A  Y 2017 
C  Y 2017 

감사 힙들

+0

이름 FG 날짜 AY 2017 BN 2017 CY 2017 DN 2017 DN 2017 EY BY 2017 E N 2017 예상 출력은 입니다. 이름 FG 날짜 A Y 2017 C Y 2017 – Omido

답변

1

을 반환하고자하는 것입니다있는 것입니다.

df['check']=df.groupby('Name').Date.transform('max') 
df.loc[(df.check==df.Date)&(df.FG=='Y'),:] 
Out[786]: 
    Name FG Date check 
1 A Y 2017 2017 
4 C Y 2017 2017 

편집 :

mask=df.groupby('Name').\ 
    apply(lambda x : (x.FG=='Y')&(x.Date>min(x.Date)) if len(x.Date)>1 else (x.FG=='Y')).values 

df[mask] 
Out[808]: 
    Name FG Date 
1 A Y 2017 
4 C Y 2017 

데이터 입력

df 
Out[809]: 
    Name FG Date 
0 A N 2016 
1 A Y 2017 
2 B N 2017 
3 B Y 2016 
4 C Y 2017 
5 D N 2017 
6 D N 2017 
7 E Y 2017 
8 E N 2017 
+0

감사합니다. 한 번만 더 질문합니다. Date 값이 서로 작거나 큰 경우 메서드가 제대로 작동합니다. 날짜가 같으면 레코드를 보관하고 싶지 않습니다. 예 :이 (E, Y, 2016) 및 (E, N, 2016)과 같은 두 개의 추가 행을 추가하십시오. 이 코드를 걸러 내기위한 조정이 있습니까? – Omido

+0

@Omido 중복되는 경우 모두 삭제하려고합니다. – Wen

+0

코드에서 drop-duplicate를 사용했지만 Date를 기반으로해야한다고 생각합니다. 따라서 "N"과 연관된 각 이름의 날짜가 "Y"상태의 날짜보다 크거나 같으면 "Y"와 연관된 행을 삭제하고 싶습니다. 이게 말이 돼? – Omido

관련 문제