249

列 A に繰り返し値を持つデータフレームがあります。列 B の値が最も高い行を保持して、重複を削除したいと考えています。

したがって、この:

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

これに変わるはずです:

A B
1 20
2 40
3 10

おそらくこれを行う簡単な方法があると思いますが、重複を削除する前に DataFrame をソートするのと同じくらい簡単かもしれませんが、それを理解するのに十分なほど groupby の内部ロジックを知りません。助言がありますか?

4

13 に答える 13

293

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

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
于 2012-10-25T00:10:02.923 に答える
132

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

于 2017-01-14T14:04:49.037 に答える
11

これを試して:

df.groupby(['A']).max()
于 2012-09-19T15:10:56.213 に答える
-9

私はあなたに完全な答えを与えるつもりはありません(とにかくファイルの部分への解析と書き込みを探しているとは思いません)が、極めて重要なヒントで十分set()です.sorted().sort().reverse()

>>> a=sorted(set([10,60,30,10,50,20,60,50,60,10,30]))
>>> a
[10, 20, 30, 50, 60]
>>> a.reverse()
>>> a
[60, 50, 30, 20, 10]
于 2012-09-19T15:03:40.067 に答える