我有一个包含重复值的A列数据框。我想删除重复项,保留B列中具有最高值的行。
所以原始数据如下:
A B
1 10
1 20
2 30
2 40
3 10
应该变成这样:
A B
1 20
2 40
3 10
我猜可能有一种简单的方法来做到这一点——也许只需在删除重复项之前对DataFrame进行排序,但我不太了解groupby的内部逻辑,不能想出来。您有什么建议吗?
A B
1 10
1 20
2 30
2 40
3 10
应该变成这样:
A B
1 20
2 40
3 10
我猜可能有一种简单的方法来做到这一点——也许只需在删除重复项之前对DataFrame进行排序,但我不太了解groupby的内部逻辑,不能想出来。您有什么建议吗?
当已有的帖子回答了问题时,我进行了小改动,通过添加应用max()函数的列名来提高代码可读性。
df.groupby('A', as_index=False)['B'].max()
"A"
和"B"
列对日期框进行排序,ascending=False
确保它从最高值到最低值排名:df.sort_values(["A", "B"], ascending=False, inplace=True)
df.drop_duplicates(inplace=True)
如果你最终来到这里,并且有一个包含多个相同列(其中一些是不同的)的数据框,并且想保留原始索引:
df = (df.sort_values('B', ascending=False)
.drop_duplicates(list(final_out_combined.columns.difference(['B'],sort=False)))
.sort_index())
drop_duplicates
中,您可以添加可能存在差异的列,例如:drop_duplicates(list(final_out_combined.columns.difference(['B', 'C'],sort=False)))
B
和C
不检查重复项。这个也可以工作:
a=pd.DataFrame({'A':a.groupby('A')['B'].max().index,'B':a.groupby('A') ['B'].max().values})
我不会给你完整的答案(我认为你也不是在寻找解析和写入文件的部分),但是一个关键的提示应该足够了:使用Python的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]