首页 > 解决方案 > 在 Pandas 中使用另一列作为索引填充一列的最大 n 值 - Python

问题描述

我有一个包含 4 列的数据框。我想为 N 列中的每个数据输入获取一列(列 ey)的最大 40 个值,同时保留其他 2 列的数据(即:我不想删除或丢失其他两列的数据)。

这个问题与这篇文章非常相似:Filter pandas Dataframe based on max values in a column。不同之处在于我正在寻找 40 个最大值,而不是最大值,而且我的数据框有更多列。

下表是我所拥有的表的一个示例,而它在每列 N 数据集中只有 4 行(实际数据框每个 N 有更多行)。

N   Ret upside_tri  ey
1   -0.1478 -14.4097 -0.3702
1   0.7571  -9.4190 -0.4609
1   -0.0045 -1.0086 0.0272
1   0.3458  -7.1714 0.0000
2   -0.1218 -9.7807 -1.5318
2   0.2283  14.7490 -0.2328
2   0.2798  -0.4965 0.1343
2   0.2273  0.0770  0.0368
3   0.0904  0.1881  -0.2433
3   -0.0526 1.8242  0.2686
3   0.0822  4.9049  -0.0416
3   0.2182  -1.0752 -0.0331
4   0.0201  4.6152  0.2242
4   0.0527  -0.3465 0.1953
4   0.1169  -1.2500 -0.0266
4   -0.1854 2.7845  0.0947
5   0.0192  -0.4258 0.1783
5   -0.0319 0.9984  0.2314
5   0.0800  1.9057  0.2101
5   -0.0447 -0.5313 0.0865

假设我想要每个 N 的 ey 的 2 个最大值(我的实际希望是拥有 40 个最大值),期望的结果会变成这样:

N   Return  upside  ey
1   -0.0045 -1.0086 0.0272
1   0.3458  -7.1714 0.0000
2   0.2798  -0.4965 0.1343
2   0.2273  0.0770  0.0368
3   -0.0526 1.8242  0.2686
3   0.2182  -1.0752 -0.0331
4   0.0201  4.6152  0.2242
4   0.0527  -0.3465 0.1953
5   -0.0319 0.9984  0.2314
5   0.0800  1.9057  0.2101

标签: pythonpandasdataframegroup-bymax

解决方案


不使用.apply()和 lambda 函数的选项。

使用.loc+ .groupby()+ .nlargest()

(所有矢量化操作以加快执行速度):

df.loc[df.groupby('N')['ey'].nlargest(2).reset_index(0).index]

结果:

    N     Ret  upside_tri      ey
2   1 -0.0045     -1.0086  0.0272
3   1  0.3458     -7.1714  0.0000
6   2  0.2798     -0.4965  0.1343
7   2  0.2273      0.0770  0.0368
9   3 -0.0526      1.8242  0.2686
11  3  0.2182     -1.0752 -0.0331
12  4  0.0201      4.6152  0.2242
13  4  0.0527     -0.3465  0.1953
17  5 -0.0319      0.9984  0.2314
18  5  0.0800      1.9057  0.2101

推荐阅读