在Pandas中如何删除所有子目录,但保留multiIndex数据帧中特定列中具有最高值的子目录?

时间:2017-08-05 15:15:27

标签: python pandas dataframe multi-index

所以我有一个这样的数据框:

+---+-----+------------+------------+-------+
|   |     | something1 | something2 | score |
+---+-----+------------+------------+-------+
| 1 | 112 |       1.00 |       10.0 |    15 |
|   | 116 |       0.76 |      -2.00 |    14 |
| 8 | 112 |       0.76 |       0.05 |    55 |
|   | 116 |       1.00 |       1.02 |    54 |
+---+-----+------------+------------+-------+

我想实现这个目标:

+---+-----+------------+------------+-------+
|   |     | something1 | something2 | score |
+---+-----+------------+------------+-------+
| 1 | 112 |       1.00 |       10.0 |    15 |
| 8 | 112 |       1.00 |       1.02 |    55 |
+---+-----+------------+------------+-------+

我想为每个第一个得分最高的索引保留一行。

我试过这样的事情,对df进行排序,然后选择每个组中的第一行,但它没有按预期工作:

df = df.sort_values("score", ascending=False).groupby(level=[0, 1]).first()

谢谢!

1 个答案:

答案 0 :(得分:2)

您只需要按级别0进行分组:

df.sort_values("score", ascending=False).groupby(level=0).first()
#     something1 something2 score
#1.0        1.00      10.00    15
#8.0        0.76       0.05    55

要保留第二级索引,您可以将其重置为列并稍后将其设置为索引:

(df.sort_values("score", ascending=False)
   .reset_index(level=1)
   .groupby(level=0).first()
   .set_index('level_1', append=True))

#           something1  something2   score
#   level_1         
#1.0    112       1.00       10.00      15
#8.0    112       0.76        0.05      55

使用nlargest的替代方案:

df.groupby(level=0, group_keys=False).apply(lambda g: g.nlargest(1, 'score'))
#        something1 something2  score
#1.0  112      1.00      10.00     15
#8.0  112      0.76       0.05     55