【问题标题】:Pandas multiindex dataframe get top 5 row of each sorted groupPandas 多索引数据框获取每个排序组的前 5 行
【发布时间】:2017-03-19 21:31:32
【问题描述】:

我有一个多索引数据框,如下所示:

我想对每个海报组进行排序(降序)并获得前 5 名。如果发帖人少于 5 人,则删除记录。

【问题讨论】:

  • 首先,请在您的问题中包含您的数据框示例,而不是发布链接。然后,发布您迄今为止为解决问题所做的尝试。

标签: python sorting pandas dataframe group-by


【解决方案1】:

假设你有以下 DF:

In [97]: df
Out[97]:
               Time
waller poster
1      11         2
       22         3
       33         1
       44         1
       55         1
2      33         1
3      11         1
       22         1
       33         1
       44         2
       55         1
       66         3

解决方案:

In [98]: (df.sort_index(ascending=[1,0])
    ...:    .groupby(level=0, as_index=False)
    ...:    .apply(lambda x: x.head(5) if len(x) >= 5 else x.head(0))
    ...:    .reset_index(level=0, drop=True)
    ...: )
    ...:
Out[98]:
               Time
waller poster
1      55         1
       44         1
       33         1
       22         3
       11         2
3      66         3
       55         1
       44         2
       33         1
       22         1

【讨论】:

    【解决方案2】:
    g = df.groupby(level=0)
    
    def lrgst(df):
        if len(df) >= 5:
            return df.nlargest(5, 'Time')
    
    pd.concat([lrgst(d) for _, d in g])
    

    【讨论】:

      【解决方案3】:

      要对海报栏进行排序,您可以使用sort level

      df.sortlevel(1, ascending=False)
      

      要获得前 n 个结果,您可以使用 .head

      df.head(5)
      

      要删除记录,您可以参考相应的级别:

      df = df[df.index.levels[1] > 5]
      

      如果这有帮助,请告诉我。很难说这是否能用有限的信息回答你的问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-21
        • 2019-02-05
        • 2017-12-26
        • 1970-01-01
        • 2020-06-21
        • 2015-12-09
        • 2022-06-29
        • 1970-01-01
        相关资源
        最近更新 更多