2017-02-08 1 views
1

와 중복은 dataframe을 가지고 :팬더 : 조건

df = pd.DataFrame(np.array([['a',0,3], 
          ['b',3,3], 
          ['c',5,6], 
          ['a',3,4] 
          ,['b',0,2]]), columns=['id','y','z']) 

df 
Out[3]: 
    id y z 
0 a 0 3 
1 b 3 3 
2 c 5 6 
3 a 3 4 
4 b 0 2 

내가 Y 컬럼에 0의 값을 갖는 모든 중복을 제거 할. 항목의 중복 값이 ​​"a"는의 비 제로 값 앞에 0의 바깥 값 함께 제공 있기 때문에 - 당신은 그것은 단지 중복을 제거하지만 다른 잎 볼 수

df.loc[(~df.duplicated('id')) | ((df.duplicated('id'))&(df['y'].astype(int)>0)),:] 
Out[4]: 
    id y z 
0 a 0 3 
1 b 3 3 
2 c 5 6 
3 a 3 4 

아래 내 시도를 참조하십시오 3. groupbys 및 정렬 등을 사용하지 않고이 문제를 해결할 방법이 있습니까? 당신은 True 모든 중복 된 경우를 표시 keep=False을 사용할 수 있습니다

감사

+0

원하는 데이터 세트를 게시 할 수 있습니까? – MaxU

답변

0

:

df[~df.id.duplicated(keep=False) | (df.id.duplicated(keep=False) & (df.y.astype(int) > 0))] 

# id y z 
#1 b 3 3 
#2 c 5 6 
#3 a 3 4 
기본적으로

, duplicated()는 인수로 first 소요되며, 중복으로 첫 번째 항목은 고려되지 않는다 몇 가지 추가 예가 있습니다 :

df.id.duplicated() 

#0 False 
#1 False 
#2 False 
#3  True 
#4  True 
#Name: id, dtype: bool 

#df.id.duplicated(keep=False)   # all duplicated ids are marked as True 
#0  True 
#1  True 
#2 False 
#3  True 
#4  True 
#Name: id, dtype: bool 
0

중복 된에는 시리즈의 모든 중복 값을 반환하는 옵션이 있습니다. 자세한 내용은 여기를 참조하십시오. http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.duplicated.html

기준에 정확히 일치하는 원본 DataFrame을 간단히 잘라낼 수 있습니다. 나는 열에 대한 DTYPE를 '해결'하는 것이 좋습니다

# keep only what is not duplicated and equals to 0 
df[~(df['id']duplicated(False) & (df['y']=='0'))] 

은 'Y'로 현재 예에서 문자열입니다. 원치 않는 문제를 방지하려면 올바른 dtype ('int'또는 'string')인지 확인하십시오!