Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除重复项,但保留具有最高值的行,包括连接_Python_Pandas_Dataframe_Duplicates - Fatal编程技术网

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