我有一个有三个级别的数据帧,我们称它们为类 -> 组 -> 值:
Class Group Value Fail
A 1 0 False
A 1 1 True
A 2 0 False
A 2 1 True
A 2 2 True
A 3 2 True
A 3 5 True
B 4 2 False
B 4 7 True
B 4 8 True
B 4 12 True
B 4 15 True
B 5 1 False
B 5 2 False
B 5 3 True
B 6 7 False
B 6 8 False
我需要获取组中最小值等于类中的最小值的组,其中Fail==True
:
Class Group Value Fail
A 1 0 False
A 1 1 True
A 2 0 False
A 2 1 True
A 2 2 True
B 5 1 False
B 5 2 False
B 5 3 True
因此,在类 A 中,Fail==True
的最小值为 1,它位于组 1 和组 2 中。在类 B 中,Fail==True
的最小值是组 5 中的 3。
怎么做?
你需要groupby.transform
,一次在类上,一次在组上,得到值的min
。你想要两者相等的地方eq
df[df['Value'].where(df['Fail']).groupby(df['Class']).transform('min')
.eq(df['Value'].where(df['Fail']).groupby(df['Group']).transform('min'))]
Class Group Value Fail
0 A 1 0 False
1 A 1 1 True
2 A 2 0 False
3 A 2 1 False
4 A 2 2 True
12 B 5 1 False
13 B 5 2 False
14 B 5 3 True
如果在多个类中具有相同的组名,则应考虑在类和组上使用第二个groupby
。
df[df['Value'].where(df['Fail']).groupby(df['Class']).transform('min')
.eq(df['Value'].where(df['Fail']).groupby([df['Class'], df['Group']]).transform('min'))]
我们分两步完成,找到min
,找到带有min
的id
df1 =df[df.Fail].copy()
s=df1.groupby('Class').Value.min()
df=df[df.Group.isin(df1.loc[df1.Value.isin(s),'Group'])]
Class Group Value Fail
0 A 1 0 False
1 A 1 1 True
2 A 2 0 False
3 A 2 1 True
4 A 2 2 True
12 B 5 1 False
13 B 5 2 False
14 B 5 3 True