我有一个在列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的内部逻辑,无法弄清楚它。有什么建议吗?
当前回答
这是最后一个。但不是最大值:
In [10]: df.drop_duplicates(subset='A', keep="last")
Out[10]:
A B
1 1 20
3 2 40
4 3 10
你还可以这样做:
In [12]: df.groupby('A', group_keys=False).apply(lambda x: x.loc[x.B.idxmax()])
Out[12]:
A B
A
1 1 20
2 2 40
3 3 10
其他回答
与所选答案非常相似的方法,但是按多列对数据帧进行排序可能是一种更简单的编码方法。
首先,根据“A”和“B”列对日期帧进行排序,ascending=False确保它从最高值到最低值进行排序:
df.sort_values(["A", "B"], ascending=False, inplace=True)
然后,删除重复项,只保留第一项,它已经是值最高的项:
df.drop_duplicates(inplace=True)
我认为在你的情况下,你真的不需要一组。我会按B列降序排序,然后在A列删除重复项如果你愿意,你也可以有一个新的nice and 像这样干净的索引:
df.sort_values('B', ascending=False).drop_duplicates('A').sort_index().reset_index(drop=True)
这也是可行的:
a=pd.DataFrame({'A':a.groupby('A')['B'].max().index,'B':a.groupby('A') ['B'].max().values})
这是最后一个。但不是最大值:
In [10]: df.drop_duplicates(subset='A', keep="last")
Out[10]:
A B
1 1 20
3 2 40
4 3 10
你还可以这样做:
In [12]: df.groupby('A', group_keys=False).apply(lambda x: x.loc[x.B.idxmax()])
Out[12]:
A B
A
1 1 20
2 2 40
3 3 10
我将首先对数据帧进行排序,列B降序,然后删除列A的重复项并保持优先
df = df.sort_values(by='B', ascending=False)
df = df.drop_duplicates(subset='A', keep="first")
没有任何分组