답변:
drop_duplicates 와 keep 매개 변수를 사용하면 팬더에서 훨씬 쉽습니다 .
import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.drop_duplicates(subset=['A', 'C'], keep=False)
df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)
?
df.drop_duplicates(subset=[df.columns[0:2]], keep = False)
drop_duplicates에 대한 Ben의 답변에 추가하고 싶습니다 .
keep
: { 'first', 'last', False}, 기본 'first'
first : 첫 번째 발생을 제외하고 중복을 삭제합니다.
last : 마지막 발생을 제외하고 중복을 삭제합니다.
False : 모든 중복을 삭제합니다.
따라서 keep
False로 설정 하면 원하는 답변을 얻을 수 있습니다.
DataFrame.drop_duplicates (* args, ** kwargs) 선택적으로 특정 열만 고려하여 중복 행이 제거 된 DataFrame을 반환합니다.
매개 변수 : 하위 집합 : 열 레이블 또는 레이블 시퀀스 (선택 사항) 중복을 식별하기 위해 특정 열만 고려하십시오. 기본적으로 모든 열을 유지하십시오 : { 'first', 'last', False}, default 'first'first : 중복 제거 첫 번째로. last : 마지막 발생을 제외하고 중복을 삭제합니다. False : 모든 중복을 삭제합니다. take_last : 더 이상 사용되지 않는 inplace : boolean, default False 복제본을 제자리에 놓을 지 아니면 복사 열을 반환할지 여부 : kwargs 하위 집합의 인수 만 [deprecated] 반환 값 : deduplicated : DataFrame
실제로, 행 0과 1을 삭제하면 일치합니다 (일치하는 A와 C를 포함하는 모든 관측치가 유지됨).
In [335]:
df['AC']=df.A+df.C
In [336]:
print df.drop_duplicates('C', take_last=True) #this dataset is a special case, in general, one may need to first drop_duplicates by 'c' and then by 'a'.
A B C AC
2 foo 1 B fooB
3 bar 1 A barA
[2 rows x 4 columns]
그러나 나는 당신이 정말로 원하는 것이 이것이라고 생각합니다 (일치하는 A와 C를 포함하는 하나의 관찰은 유지됩니다).
In [337]:
print df.drop_duplicates('AC')
A B C AC
0 foo 0 A fooA
2 foo 1 B fooB
3 bar 1 A barA
[3 rows x 4 columns]
이제 훨씬 더 명확합니다.
In [352]:
DG=df.groupby(['A', 'C'])
print pd.concat([DG.get_group(item) for item, value in DG.groups.items() if len(value)==1])
A B C
2 foo 1 B
3 bar 1 A
[2 rows x 3 columns]
df.drop_duplicates(['A','C'])
기본적으로 하나의 관찰이 질문에서 언급 한 것처럼 첫 번째 또는 마지막을 취하게 유지 하기 때문에 사용 합니다. 원하는 것은 관심있는 열 (예제 데이터의 A 및 C)에서 동일한 모든 행을 삭제하는 것입니다.