Python Pandas에서 모든 중복 행을 삭제하십시오.


160

pandas drop_duplicates기능은 데이터 프레임을 "고유 화"하는 데 유용합니다. 그러나 전달할 키워드 인수 중 하나는 take_last=True또는 take_last=False입니다. 열의 하위 집합에서 중복되는 모든 행을 삭제하고 싶습니다. 이게 가능해?

    A   B   C
0   foo 0   A
1   foo 1   A
2   foo 1   B
3   bar 1   A

예를 들어, 나는 열을 일치 행 드롭 싶습니다 AC행 0과 1을 삭제해야이 정도.

답변:


235

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)

2
열에 명시 적으로 레이블이 지정되지 않은 경우 어떻게합니까? 색인을 기준으로 열을 어떻게 선택합니까?
Hamman Samuel

2
아마도 df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)?
Ben

5
당신은 시도df.drop_duplicates(subset=[df.columns[0:2]], keep = False)
seeiespi

68

drop_duplicates에 대한 Ben의 답변에 추가하고 싶습니다 .

keep : { 'first', 'last', False}, 기본 'first'

  • first : 첫 번째 발생을 제외하고 중복을 삭제합니다.

  • last : 마지막 발생을 제외하고 중복을 삭제합니다.

  • False : 모든 중복을 삭제합니다.

따라서 keepFalse로 설정 하면 원하는 답변을 얻을 수 있습니다.

DataFrame.drop_duplicates (* args, ** kwargs) 선택적으로 특정 열만 고려하여 중복 행이 제거 된 DataFrame을 반환합니다.

매개 변수 : 하위 집합 : 열 레이블 또는 레이블 시퀀스 (선택 사항) 중복을 식별하기 위해 특정 열만 고려하십시오. 기본적으로 모든 열을 유지하십시오 : { 'first', 'last', False}, default 'first'first : 중복 제거 첫 번째로. last : 마지막 발생을 제외하고 중복을 삭제합니다. False : 모든 중복을 삭제합니다. take_last : 더 이상 사용되지 않는 inplace : boolean, default False 복제본을 제자리에 놓을 지 아니면 복사 열을 반환할지 여부 : kwargs 하위 집합의 인수 만 [deprecated] 반환 값 : deduplicated : DataFrame


26

결과를 다른 데이터 세트에 저장하려면 다음을 수행하십시오.

df.drop_duplicates(keep=False)

또는

df.drop_duplicates(keep=False, inplace=False)

동일한 데이터 세트를 업데이트해야하는 경우 :

df.drop_duplicates(keep=False, inplace=True)

위의 예제는 모든 복제본을 제거하고 DISTINCT *SQL 과 유사하게 하나를 유지합니다.


12

사용 groupbyfilter

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.groupby(["A", "C"]).filter(lambda df:df.shape[0] == 1)

5

실제로, 행 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]

1
그것이 내가 원했던 것이라면, 나는 df.drop_duplicates(['A','C'])기본적으로 하나의 관찰이 질문에서 언급 한 것처럼 첫 번째 또는 마지막을 취하게 유지 하기 때문에 사용 합니다. 원하는 것은 관심있는 열 (예제 데이터의 A 및 C)에서 동일한 모든 행을 삭제하는 것입니다.
Jamie Bull

0

이 다양한 것들을보십시오

df = pd.DataFrame({"A":["foo", "foo", "foo", "bar","foo"], "B":[0,1,1,1,1], "C":["A","A","B","A","A"]})

>>>df.drop_duplicates( "A" , keep='first')

또는

>>>df.drop_duplicates( keep='first')

또는

>>>df.drop_duplicates( keep='last')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.