我有一个这样的多索引数据框:
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'
我做错了什么?
答案 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