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

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을 삭제해야이 정도.



답변

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)


답변

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


답변

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

df.drop_duplicates(keep=False)

또는

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

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

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

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


답변

사용 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)


답변

실제로, 행 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 = 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')


답변