使用另一列作为 Pandas - Python 中的索引过滤列的最大 n 个值
Fillter the largest n values of a column using another column as index in Pandas - Python
我有一个包含 4 列的数据框。我想为第 N 列中的每个数据输入获取一列(列 ey)的最大 40 个值,同时保留其他 2 列的数据(即:我不想删除或丢失其他两列的数据).
这个问题与post非常相似:Filter pandas Dataframe based on max values in a column。不同之处在于我正在寻找 40 个最大值,而不是最大值,而且我的数据框有更多列。
下面的 table 是我所拥有的 table 的示例,而它在每列 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
IIUC,你可以试试:
df1 = df.groupby('N').apply(lambda x: x.nlargest(n = 2, columns= ['ey'])).reset_index(drop=True)
不使用 .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
我有一个包含 4 列的数据框。我想为第 N 列中的每个数据输入获取一列(列 ey)的最大 40 个值,同时保留其他 2 列的数据(即:我不想删除或丢失其他两列的数据).
这个问题与post非常相似:Filter pandas Dataframe based on max values in a column。不同之处在于我正在寻找 40 个最大值,而不是最大值,而且我的数据框有更多列。
下面的 table 是我所拥有的 table 的示例,而它在每列 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
IIUC,你可以试试:
df1 = df.groupby('N').apply(lambda x: x.nlargest(n = 2, columns= ['ey'])).reset_index(drop=True)
不使用 .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