programing

Python Panda에서 여러 열에 걸쳐 중복된 모든 행 삭제

goodjava 2023. 1. 15. 16:55

Python Panda에서 여러 열에 걸쳐 중복된 모든 행 삭제

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

예를 들어 열과 일치하는 행을 드롭하고 싶다.A그리고.C따라서 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 반환(옵션으로 특정 열만 고려)

매개 변수: 하위 집합: 열 레이블 또는 레이블 시퀀스, 선택적 중복 식별을 위해 특정 열만 고려합니다. 기본적으로 모든 열 keep: {'first', 'last', False, 기본 'first' first: 첫 번째 열을 제외하고 중복 항목을 삭제합니다.last : 마지막 오카렌스를 제외하고 중복을 삭제합니다.False : 모든 중복을 삭제합니다.take_last : 폐지된 inplace : boolean, 기본 False 중복을 폐기할지 또는 복사 콜을 반환할지 : kwargs only 인수 of subset [deplicated] 반환: deduplicated : DataFrame

결과를 다른 데이터 세트에 저장하는 경우:

df.drop_duplicates(keep=False)

또는

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

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

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

위의 예에서는 다음과 같이 모든 중복을 제거하고 1개를 유지합니다.DISTINCT *SQL에서

사용하다groupby그리고.filter

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)

이 다양한 것들을 시도해 보세요

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')

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

언급URL : https://stackoverflow.com/questions/23667369/drop-all-duplicate-rows-across-multiple-columns-in-python-pandas