【问题标题】:Multi index dataframe delete row with maximum value per group多索引数据框删除每组最大值的行
【发布时间】:2021-04-10 02:53:12
【问题描述】:

我有一个这样的多索引数据框:

PID    Fid    x      y

  A      1    2      3
         2    6      1
         3    4      6
  B      1    3      5
         2    2      4
         3    5      7

我想删除每个患者 (PID) 具有最高 x 值的行。我需要获取一个包含剩余行和所有列的新数据框,以继续对这些数据进行分析,例如剩余 y 值的平均值。 数据框应如下所示:

PID    Fid    x      y

  A      1    2      3
         3    4      6
  B      1    3      5
         2    2      4

我使用了Python Multiindex Dataframe remove maximum的代码

idx = (df.reset_index('Fid')
                   .groupby('PID')['x']
                   .max()
                   .reset_index()
                   .values.tolist())
df_s = df.loc[df.index.difference(idx)]

我可以获取 idx,但不能将它们从数据框中删除。它说 TypeError: unhashable type: 'list'

我做错了什么?

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    你可以试试这个:

    idx = df.groupby(level=0)['x'].idxmax()
    df[~df.index.isin(idx)]
    
             x  y
    PID Fid      
    A   1    2  3
        3    4  6
    B   1    3  5
        2    2  4
    

    或者

    您可以在此处使用pd.Index.difference

    df.loc[df.index.difference(df['x'].groupby(level=0).idxmax())] #Use level=0 if index is unnamed
                                             #('PID').idxmax())] 
             x  y
    PID Fid      
    A   1    2  3
        3    4  6
    B   1    3  5
        2    2  4
    

    【讨论】:

    • 谢谢!第二个选项对我有用。第一个导致错误:KeyError:'PID'
    • @NienkeH 在第一个也使用groupby(level=0)
    【解决方案2】:

    使用GroupBy.transform 重复每个组的最大值,通过Series.ne 比较不相等并在boolean indexing 中过滤:

    df_s = df[df.groupby('PID')['x'].transform('max').ne(df['x'])]
    print (df_s)
             x  y
    PID Fid      
    A   1    2  3
        3    4  6
    B   1    3  5
        2    2  4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 2018-01-02
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 2021-07-19
      • 2015-06-13
      • 2016-05-07
      相关资源
      最近更新 更多