我有一个在列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中最常见的关联字符串。

df.groupby(“一列圆柱”)。gg ({columnB:λx: x.mode () .any ()}) .reset_index ()

any()会在模式相同的情况下选择一个。(注意,对int类型的Series使用.any()将返回一个布尔值,而不是从中选择一个。)

对于原问题,相应的方法简化为

df.groupby(一列圆柱).columnB.agg (max) .reset_index()。

其他回答

这也是可行的:

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

最简单的解决方案:

删除基于一列的重复项:

df = df.drop_duplicates('column_name', keep='last')

删除基于多个列的重复数据。

df = df.drop_duplicates(['col_name1','col_name2','col_name3'], keep='last')

这是我必须解决的一个值得分享的变化:对于列a中的每个唯一字符串,我想找到列b中最常见的关联字符串。

df.groupby(“一列圆柱”)。gg ({columnB:λx: x.mode () .any ()}) .reset_index ()

any()会在模式相同的情况下选择一个。(注意,对int类型的Series使用.any()将返回一个布尔值,而不是从中选择一个。)

对于原问题,相应的方法简化为

df.groupby(一列圆柱).columnB.agg (max) .reset_index()。

我认为在你的情况下,你真的不需要一组。我会按B列降序排序,然后在A列删除重复项如果你愿意,你也可以有一个新的nice and 像这样干净的索引:

df.sort_values('B', ascending=False).drop_duplicates('A').sort_index().reset_index(drop=True)