我有一个在列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中值最高的行。
所以这个:
A B
1 10
1 20
2 30
2 40
3 10
应该变成这样:
A B
1 20
2 40
3 10
我猜可能有一种简单的方法可以做到这一点——可能就像在删除重复数据之前对DataFrame进行排序一样简单——但是我不太了解groupby的内部逻辑,无法弄清楚它。有什么建议吗?
当前回答
最简单的解决方案:
删除基于一列的重复项:
df = df.drop_duplicates('column_name', keep='last')
删除基于多个列的重复数据。
df = df.drop_duplicates(['col_name1','col_name2','col_name3'], keep='last')
其他回答
最上面的答案是做了太多的工作,对于更大的数据集看起来非常慢。应用速度较慢,应尽量避免。Ix已被弃用,也应该避免使用。
df.sort_values('B', ascending=False).drop_duplicates('A').sort_index()
A B
1 1 20
3 2 40
4 3 10
或者简单地按所有其他列分组,然后取所需列的最大值。df。groupby (A, as_index = False) .max ()
这也是可行的:
a=pd.DataFrame({'A':a.groupby('A')['B'].max().index,'B':a.groupby('A') ['B'].max().values})
你也可以试试这个
df.drop_duplicates(subset='A', keep='last')
我参考了https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html
我认为在你的情况下,你真的不需要一组。我会按B列降序排序,然后在A列删除重复项如果你愿意,你也可以有一个新的nice and 像这样干净的索引:
df.sort_values('B', ascending=False).drop_duplicates('A').sort_index().reset_index(drop=True)
我不会给你完整的答案(我不认为你在寻找解析和写入文件的部分),但一个关键的提示应该足够了:使用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]