按较低级别的值筛选多级数据帧



我有一个有三个级别的数据帧,我们称它们为类 -> 组 -> 值:

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

最新更新