[python] python pandas : 열 A에서 중복을 제거하고 열 B에서 가장 높은 값을 유지

열 A에 반복 값이있는 데이터 프레임이 있습니다. 열 B를 가장 높은 값으로 유지하면서 중복을 삭제하고 싶습니다.

그래서 이거:

A B
1 10
1 20
2 30
2 40
3 10

이것으로 바꿔야합니다 :

A B
1 20
2 40
3 10

Wes는 중복을 제거하는 몇 가지 훌륭한 기능을 추가했습니다. http://wesmckinney.com/blog/?p=340 . 그러나 AFAICT는 정확한 복제를 위해 설계되었으므로 유지할 행을 선택하는 기준에 대한 언급은 없습니다.

중복을 삭제하기 전에 데이터 프레임을 정렬하는 것만큼이나 쉬운 방법이있을 것입니다.하지만 그룹 별 내부 논리를 잘 알지 못합니다. 어떤 제안?



답변

마지막이 걸립니다. 그러나 최대 값은 아닙니다.

In [10]: df.drop_duplicates(subset='A', keep="last")
Out[10]:
   A   B
1  1  20
3  2  40
4  3  10

다음과 같은 작업을 수행 할 수도 있습니다.

In [12]: df.groupby('A', group_keys=False).apply(lambda x: x.loc[x.B.idxmax()])
Out[12]:
   A   B
A
1  1  20
2  2  40
3  3  10


답변

가장 큰 대답은 너무 많은 작업을 수행하고 있으며 더 큰 데이터 세트에 대해서는 매우 느리게 보입니다. apply느리고 가능한 경우 피해야합니다. ix더 이상 사용되지 않으며 피해야합니다.

df.sort_values('B', ascending=False).drop_duplicates('A').sort_index()

   A   B
1  1  20
3  2  40
4  3  10

또는 다른 모든 열을 기준으로 그룹화하고 필요한 열을 최대한 활용하십시오. df.groupby('A', as_index=False).max()


답변

가장 간단한 해결책 :

한 열을 기준으로 중복을 삭제하려면

df = df.drop_duplicates('column_name', keep='last')

여러 열을 기준으로 중복을 삭제하려면

df = df.drop_duplicates(['col_name1','col_name2','col_name3'], keep='last')


답변

이 시도:

df.groupby(['A']).max()


답변

먼저 B 열을 내림차순으로 데이터 프레임을 정렬 한 다음 A 열에 대해 중복을 삭제하고 먼저 유지하십시오.

df = df.sort_values(by='B', ascending=False)
df = df.drop_duplicates(subset='A', keep="first")

어떤 그룹없이


답변

당신도 이것을 시도 할 수 있습니다

df.drop_duplicates(subset='A', keep='last')

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html 에서 이것을 참조했습니다.


답변

나는 당신의 경우에 당신은 정말로 그룹별로 필요하지 않다고 생각합니다. 나는 B 열을 내림차순으로 정렬 한 다음 A 열에서 중복을 삭제하고 원하는 경우 다음과 같이 새롭고 깔끔한 인덱스를 가질 수 있습니다.

df.sort_values('B', ascending=False).drop_duplicates('A').sort_index().reset_index(drop=True)