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



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

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中的代码删除最大

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

我可以获取idx,但不能从数据帧中删除它们。上面写着TypeError:不可更改的类型:"列表">

我做错了什么?

你可以试试这个:

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

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

最新更新