我有一个数据框
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较小
答案 0 :(得分:0)
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