如果我的数据框看起来像
value otherstuff
0 4 x
0 5 x
0 2 x
1 2 x
2 3 x
2 7 x
获得看起来像
的新数据框架的简洁方法是什么 value otherstuff
0 5 x
1 2 x
2 7 x
哪里删除了具有相同索引的行,所以只剩下具有最大'value'的行?据我所知,df.drop_duplicates中没有选项可以保持最大值,只保留第一次或最后一次。
答案 0 :(得分:5)
您可以将max
与level=0
:
df.max(level=0)
输出:
value otherstuff
0 5 x
1 2 x
2 7 x
OR,以解决评论中提到的其他列:
df.groupby(level=0,group_keys=False)\
.apply(lambda x: x.loc[x['value']==x['value'].max()])
输出:
value otherstuff
0 5 x
1 2 x
2 7 x
答案 1 :(得分:3)
您可以使用groupby.transform
计算每组的最大值,然后将值列与最大值进行比较,如果为true,则保留行:
df[df.groupby(level=0).value.transform('max').eq(df.value)]
# value otherstuff
#0 5 x
#1 2 x
#2 7 x
答案 2 :(得分:2)
您可以按value
排序以确保您将获取最大值,然后按索引分组并获取每个组的第一个成员。
(df.sort_values(by='value', ascending=False)
.groupby(level=0)
.head(1)
.sort_index())
哪个收益
value otherstuff
0 5 x
1 2 x
2 7 x
答案 3 :(得分:0)
如果没有groupby
,您可以起诉sort_values
和drop_duplicates
df2['INDEX'] = df2.index
df2.sort_values(['INDEX', 'value'],ascending=[True,False]).
drop_duplicates(['INDEX'],keep='first')
Out[47]:
value otherstuff INDEX
0 5 x 0
1 2 x 1
2 7 x 2