在 Pandas 中,如何删除所有子行但保留在 multiIndex 数据帧的特定列中具有最高值的子行?
In Pandas how to remove all subrows but keep one which has the highest value in a specific column in a multiIndex dataframe?
所以我有一个这样的数据框:
+---+-----+------------+------------+-------+
| | | 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()
谢谢!
只需要按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
所以我有一个这样的数据框:
+---+-----+------------+------------+-------+
| | | 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()
谢谢!
只需要按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