Python 删除重复项,但保留具有最高值的行,包括连接
我想删除Python 删除重复项,但保留具有最高值的行,包括连接,python,pandas,dataframe,duplicates,Python,Pandas,Dataframe,Duplicates,我想删除col1的重复值,只保存col2中值最高的行。示例df: df1 = pd.DataFrame({'col1': ['a', 'a', 'b', 'b', 'c'], 'col2': [5, 5, 10, 15, 20]}) 我知道df1。drop_duplicates将消除重复的值,但如何确保保存的是最高值(或者如果存在与最高值绑定的值,则为多个值) 期望输出: dfoutput = pd.DataFrame({'col1': ['a', 'a'
col1
的重复值,只保存col2
中值最高的行。示例df:
df1 = pd.DataFrame({'col1': ['a', 'a', 'b', 'b', 'c'],
'col2': [5, 5, 10, 15, 20]})
我知道df1。drop_duplicates
将消除重复的值,但如何确保保存的是最高值(或者如果存在与最高值绑定的值,则为多个值)
期望输出:
dfoutput = pd.DataFrame({'col1': ['a', 'a', 'b', 'c'],
'col2': [5, 5, 15, 20]})
从按降序排列数据帧开始。接下来,计算两个掩码,一个用于计算组中最大的行数,另一个用于计算重复的行数 然后,我们可以组合这些掩码来确定哪些行是重复的,而不是它们各自组中的最大值,并执行最后一个过滤步骤
v = df1.sort_values('col2', ascending=False)
m1 = v['col2'] == v.groupby('col1', sort=False)['col2'].transform('max')
m2 = v.duplicated('col1')
v[~(m2 & ~m1)].sort_index() # v[~m2 | m1] - DeMorgan's Law
col1 col2
0 a 5
1 a 5
3 b 15
4 c 20
您可以使用熊猫的功能:
将等级分配给组中的每一行。如果值相同,则行将具有相同的秩。如下所示:
In [126]: df1['rnk'] = df1.groupby('col1')['col2'].rank()
In [127]: df1
Out[127]:
col1 col2 rnk
0 a 5 1.5
1 a 5 1.5
2 b 10 1.0
3 b 15 2.0
4 c 20 1.0
然后使用方法仅过滤小于2.0的列组:
In [129]: df1.query('rnk < 2.0').drop('rnk',1)
Out[129]:
col1 col2
0 a 5
1 a 5
2 b 10
4 c 20
[129]中的:df1.query('rnk<2.0')。drop('rnk',1)
出[129]:
col1 col2
零五
1 a 5
2 b 10
4 c 20
可以组合上述两个命令以获得单线解决方案:
[130]中的df1[df1.groupby('col1')['col2'].rank()<2]
出[130]:
col1 col2
零五
1 a 5
2 b 10
4 c 20
我发现的另一种方法:
获取重复项并在按降序
顺序排序后使用已消除重复项的值将其追加,然后除去重复的索引
dfoutput = df1[df1.duplicated(keep=False)].append(df1.sort_values(['col1','col2'],ascending=False).drop_duplicates(['col1']))
dfoutput[~dfoutput.index.duplicated()].sort_index()
col1 col2
0 a 5
1 a 5
3 b 15
4 c 20
有趣的解决方案!实际上,不需要额外的列,只需执行df1[df1.groupby('col1')['col2'].rank()<2]
即可。是的,我知道不需要额外的列。把它放在那里是为了理解OP。我更喜欢第一个,它给出了OP想要的输出。:)@谢谢你!没有意识到结果中存在差异+我也会喜欢你的。
dfoutput = df1[df1.duplicated(keep=False)].append(df1.sort_values(['col1','col2'],ascending=False).drop_duplicates(['col1']))
dfoutput[~dfoutput.index.duplicated()].sort_index()
col1 col2
0 a 5
1 a 5
3 b 15
4 c 20