熊猫比较和删除行

时间:2018-02-23 06:39:32

标签: pandas

我有一个数据框

d = pd.DataFrame({'d': ['d1', 'd1', 'd1', 'd1', 'd2', 'd2', 'd2','d2'], 's':[1, 2, 1, 1, 2, 2, 1, 2], 'v': [100, 5000, 200, 900, 100, 2000, 300, 300]})

     d  s   v
0   d1  1   100
1   d1  2   5000
2   d1  1   200
3   d1  1   900
4   d2  2   100
5   d2  2   2000
6   d2  1   300
7   d2  2   300

对于列d和s的每个唯一组合,我只想保留最大值为v的行。 所以结果看起来像

d = pd.DataFrame({'d': ['d1', 'd1', 'd2', 'd2'], 's':[1, 2, 1, 2], 'v': [900, 5000, 300, 2000]})

    d   s   v
0   d1  1   900
1   d1  2   5000
2   d2  1   300
3   d2  2   2000

我该如何有效地做到这一点? 如果是平局,我宁愿保留第一个条目或使用另一个列t(在示例中未显示)作为平局破坏者,如果这很容易实现的话。

编辑: 对于领带破坏者,我会有另一列t。下面的数据框(从初始数据略有变化)现在在d2处有一个平局,s = 1,v = 300

d = pd.DataFrame({'d': ['d1', 'd1', 'd1', 'd1', 'd2', 'd2', 'd2','d2'], 't':[1, 3, 5, 6, 2, 3, 8, 4], 's':[1, 2, 1, 1, 2, 2, 1, 1], 'v': [100, 5000, 200, 900, 100, 2000, 300, 300]})

    d   s   t   v
0   d1  1   1   100
1   d1  2   3   5000
2   d1  1   5   200
3   d1  1   6   900
4   d2  2   2   100
5   d2  2   3   2000
6   d2  1   8   300
7   d2  1   4   300

,结果应该是

d = pd.DataFrame({'d': ['d1', 'd1', 'd2', 'd2'], 't': [6, 3, 4, 3], 's':[1, 2, 1, 2], 'v': [900, 5000, 300, 2000]})

    d   s   t   v
0   d1  1   6   900
1   d1  2   3   5000
2   d2  1   4   300
3   d2  2   3   2000

因此,我们在第6行选择第7行,因为t较小

1 个答案:

答案 0 :(得分:0)

sort_values使用drop_duplicates

df1 = (d.sort_values(['d','s','v'], ascending=(True, True, False))
          .drop_duplicates(['d','s']))
print (df1)
    d  s     v
3  d1  1   900
1  d1  2  5000
6  d2  1   300
5  d2  2  2000

df = (d.sort_values(['d','s','v', 't'], ascending=(True, True, False, True))
      .drop_duplicates(['d','s']))
print (df)
    d  s  t     v
3  d1  1  6   900
1  d1  2  3  5000
7  d2  1  4   300
5  d2  2  3  2000