python - 在 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
解决方案
不使用.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
推荐阅读
- arrays - 查询开头的 id 数组中的 Wp_query 项目
- java - 当我在工具栏标题和副标题中加载徽标时不显示
- ruby-on-rails - Rails:对单个字段使用多个复选框
- lua - Lua:垃圾收集器的行为是否随着 Lua 5.3.2 改变?
- java - 如何从firebase中的单个子值获取多个键?
- javascript - html javascript中的无限滚动
- codenameone - IOS wkwebview 不适用于 mailto 链接或 tel 链接
- javascript - 通过 Jest 在 React 中测试 componentDidUpdate 中的 prevProps
- c++ - 为什么我们没有用于地图的 hash 和 pred 函子?
- c - 在 C 中的变量中定义的数组大小无法在 IAR 中编译,但在 Keil 中构建良好