多索引数据帧删除每个组具有最大值的行

人气:67 发布:2023-01-03 标签: python pandas dataframe multi-index

问题描述

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

PID    Fid    x      y

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

我想删除每个患者具有最高x值(PID)的行。我需要获得一个包含剩余行和所有列的新数据帧,以继续对这些数据进行分析,例如剩余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:Unhasable type:‘list’

我做错了什么?

推荐答案

您可以尝试:

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

15