Pandas使用四分位数删除Groupby两列的行。

问题描述 投票:0回答:1

大家早上好

我有一个问题,我想使用百分位数和组比的条件删除行,例如。

对于列键中的每一个x, y ... 和每一组iden a, b, c ... 它将删除在第一个pencetilequantile和最后一个使用函数的元素: Min & Max 或用.quantile (.1) 和. quantile (.9) 在val1上删除。

输入。

df = pd.DataFrame([
    ['x', 'a', 9.5, 10.5], ['x', 'b', 6.8, 7], ['y','a', 7.2, 8],
    ['x', 'a', 11.5, 11.5], ['y', 'c', 1.5, 1.5], ['y', 'c', 8.7, 8.7],
    ['x', 'a', 15.5, 1.5], ['y', 'c', 2.5, 2.5], ['y', 'c', 9.5, 1.7]
], columns=['key', 'iden','val','val2'])
df
   key  iden val  val2
0   x   a   9.5   10.5
1   x   b   6.8   7.0
2   y   a   7.2   8.0
3   x   a   11.5  11.5
4   y   c   1.5   1.5
5   y   c   8.7   8.7
6   x   a   15.5  1.5
7   y   c   2.5   2.5
8   y   c   9.5   1.7

我需要得到这个结果。

    key iden val val2
0   x   b   6.8  7.0
1   y   a   7.2  8.0
2   y   c   8.7  8.7
3   x   a   11.5 11.5
4   y   c   2.5  2.5


python pandas percentile
1个回答
2
投票

使用。

g = df.groupby(['key', 'iden'])['val']
m = df['val'].between(g.transform('quantile', 0.1), g.transform('quantile', 0.9))
df = df[m]

或者使用:

m = (
    df.groupby(['key', 'iden'])['val']
    .transform(lambda s: s.between(s.quantile(0.1), s.quantile(0.9)))
)
df = df[m]

print(df)
  key iden   val  val2
1   x    b   6.8   7.0
2   y    a   7.2   8.0
3   x    a  11.5  11.5
5   y    c   8.7   8.7
7   y    c   2.5   2.5
© www.soinside.com 2019 - 2024. All rights reserved.