【问题标题】:Fillter the largest n values of a column using another column as index in Pandas - Python使用另一列作为 Pandas 中的索引过滤一列的最大 n 值 - Python
【发布时间】:2021-09-11 01:10:56
【问题描述】:

我有一个包含 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

【问题讨论】:

    标签: python pandas dataframe group-by max


    【解决方案1】:

    不使用.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
    

    【讨论】:

    • 完美!像魅力一样工作!你如何在 Stackoverflow 中粘贴格式如此精美的表格?每次我必须在此处粘贴数据框时,格式看起来都很糟糕。
    【解决方案2】:

    IIUC,你可以试试:

    df1 = df.groupby('N').apply(lambda x: x.nlargest(n = 2, columns= ['ey'])).reset_index(drop=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 2012-04-08
      • 2016-06-08
      • 2019-06-15
      • 1970-01-01
      相关资源
      最近更新 更多