source

두 열 A,B를 기준으로 데이터 프레임에서 중복 제거, 다른 열 C에 최대값이 있는 행 유지

nicesource 2023. 10. 11. 20:47
반응형

두 열 A,B를 기준으로 데이터 프레임에서 중복 제거, 다른 열 C에 최대값이 있는 행 유지

두 열(A 및 B)에 따라 중복된 값을 포함하는 팬더 데이터 프레임이 있습니다.

A B C
1 2 1
1 2 4
2 7 1
3 4 0
3 4 8

C열에 최대값이 있는 행을 유지하는 중복을 제거하고 싶습니다.이를 통해 다음을 얻을 수 있습니다.

A B C
1 2 4
2 7 1
3 4 8

저는 그것을 어떻게 하는지 모르겠어요.사용할까요?drop_duplicates(), 다른 거?

다음 방법으로 그룹을 사용하여 작업할 수 있습니다.

c_maxes = df.groupby(['A', 'B']).C.transform(max)
df = df.loc[df.C == c_maxes]

c_maxesSeries의 최댓값의C각 그룹에서 동일한 길이와 동일한 지수를 가진df. 사용하지 않으신 경우.transform그다음에 인쇄하기c_maxes어떻게 작동하는지 확인해 보는 것이 좋을 것 같습니다.

를 이용한 또 다른 접근법drop_duplicates되지요

df.sort('C').drop_duplicates(subset=['A', 'B'], take_last=True)

어떤 것이 더 효율적인지는 잘 모르겠지만 분류가 필요 없는 첫 번째 방법인 것 같습니다.

편집: 보낸 사람pandas 0.18두번째 해결책은

df.sort_values('C').drop_duplicates(subset=['A', 'B'], keep='last')

아니면, 아니면,

df.sort_values('C', ascending=False).drop_duplicates(subset=['A', 'B'])

여하튼.groupby솔루션의 성능이 크게 향상된 것으로 보입니다.

%timeit -n 10 df.loc[df.groupby(['A', 'B']).C.max == df.C]
10 loops, best of 3: 25.7 ms per loop

%timeit -n 10 df.sort_values('C').drop_duplicates(subset=['A', 'B'], keep='last')
10 loops, best of 3: 101 ms per loop

팬더 드롭 복제 기능으로 간단하게 할 수 있습니다.

df.drop_duplicates(['A','B'],keep= 'last')

저는 그룹비가 효과가 있어야 한다고 생각합니다.

df.groupby(['A', 'B']).max()['C']

데이터 프레임이 필요한 경우 재설정 인덱스 호출을 체인으로 연결할 수 있습니다.

df.groupby(['A', 'B']).max()['C'].reset_index()

같이 하시면 됩니다.drop_duplicates원하시는 대로

# initialisation
d = pd.DataFrame({'A' : [1,1,2,3,3], 'B' : [2,2,7,4,4],  'C' : [1,4,1,0,8]})

d = d.sort_values("C", ascending=False)
d = d.drop_duplicates(["A","B"])

동일한 주문을 받는 것이 중요한 경우

d = d.sort_index()

언급URL : https://stackoverflow.com/questions/32093829/remove-duplicates-from-dataframe-based-on-two-columns-a-b-keeping-row-with-max

반응형