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

时间:2021-01-04 09:46:27

标签: 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

我想删除每个患者 (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'

我做错了什么?

2 个答案:

答案 0 :(得分:4)

你可以试试这个:

0f6697f5-f9d4-4883-afa0-0458c02090b2

您可以在此处使用 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

答案 1 :(得分: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
相关问题