web-dev-qa-db-ja.com

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=34 。ただしAFAICTは、完全に重複するように設計されているため、保持する行を選択する基準については言及されていません。

私はおそらくこれを行う簡単な方法があると推測しています-重複を削除する前にデータフレームを並べ替えるのと同じくらい簡単かもしれませんが、groupbyの内部ロジックを理解するのに十分な知識がありません。助言がありますか?

107
Abe

これには最後が必要です。ただし、最大値ではありません:

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
136
Wes McKinney

一番の答えは、あまりにも多くの作業を行うことであり、大きなデータセットでは非常に遅いようです。 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()

52
Ted Petrou

これを試して:

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

最も簡単なソリューション:

1つの列に基づいて重複を削除するには:

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

複数の列に基づいて重複を削除するには:

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

これも試してみてください

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

私はこれを https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html から参照しました

1
Venkat

あなたの場合、あなたは本当にグループバイを必要としないと思います。 B列を降順で並べ替え、列Aに重複をドロップします。必要に応じて、そのような新しいNiceインデックスを作成することもできます。

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

既に与えられた投稿が質問に答えたら、コードを読みやすくするためにmax()関数が適用される列名を追加して小さな変更を加えました。

df.groupby('A', as_index=False)['B'].max()
0
Bhagabat Behera