Pandas复制数据帧仅保留具有相同索引的行的最大值

时间:2017-08-06 00:47:03

标签: python pandas dataframe

如果我的数据框看起来像

    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中没有选项可以保持最大值,只保留第一次或最后一次。

4 个答案:

答案 0 :(得分:5)

您可以将maxlevel=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_valuesdrop_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