列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=34 。ただしAFAICTは、完全に重複するように設計されているため、保持する行を選択する基準については言及されていません。
私はおそらくこれを行う簡単な方法があると推測しています-重複を削除する前にデータフレームを並べ替えるのと同じくらい簡単かもしれませんが、groupbyの内部ロジックを理解するのに十分な知識がありません。助言がありますか?
これには最後が必要です。ただし、最大値ではありません:
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.groupby(['A']).max()
最も簡単なソリューション:
1つの列に基づいて重複を削除するには:
df = df.drop_duplicates('column_name', keep='last')
複数の列に基づいて重複を削除するには:
df = df.drop_duplicates(['col_name1','col_name2','col_name3'], keep='last')
これも試してみてください
df.drop_duplicates(subset='A', keep='last')
私はこれを https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html から参照しました
あなたの場合、あなたは本当にグループバイを必要としないと思います。 B列を降順で並べ替え、列Aに重複をドロップします。必要に応じて、そのような新しいNiceインデックスを作成することもできます。
df.sort_values('B', ascending=False).drop_duplicates('A').sort_index().reset_index(drop=True)
既に与えられた投稿が質問に答えたら、コードを読みやすくするためにmax()関数が適用される列名を追加して小さな変更を加えました。
df.groupby('A', as_index=False)['B'].max()