我有一个这样的多索引数据帧:
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