按另一列的百分比分组删除数据



我可以使用从列中删除95%以上的数据

df[df.value < df.value.quantile(.95)]

如何删除按另一列分组的95%以上的数据?

所以,如果我有一个像下面这样的数据帧,我想删除第1行,因为它在类型a中超过了95%。

Row  type  value 
1    A     100000
2    A     0.1
3    A     0.3
4    B     10
5    B     11

编辑:我想删除所有"类型"的95%以上数据-删除A类、B类等的95%以上

您尝试过吗:

df[df['value'].lt(df.groupby('type')['value'].transform(lambda s: s.quantile(.95)))]

或者,缩写形式:

df[df['value'].lt(df.groupby('type')['value'].transform('quantile', .95))]

输出:

Row type  value
1    2    A    0.1
2    3    A    0.3
3    4    B   10.0

一个简单的解决方案,.groupby.apply用于过滤每组中的行:

df.groupby('type', group_keys=False).apply(
lambda g: g[g.value < g.value.quantile(.95)]
)
Row type  value
1    2    A    0.1
2    3    A    0.3
3    4    B   10.0

以前的解决方案-如果您想仅删除类型A中95%以上的数据

vals_a = df.loc[df.type.eq('A'), 'value']
df[df.value.lt(vals_a.quantile(.95)) & df.type.eq('A') | df.type.ne('A')] 

结果:

Row type  value
1    2    A    0.1
2    3    A    0.3
3    4    B   10.0
4    5    B   11.0

最新更新