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