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

Pandas delete rows with Groupby two columns using quartile

大家早上好,

我有问题,我想删除使用百分位数和分组依据条件的行,例如:

对于列键中的每个 x, y .. 以及每组 iden a, b, c .. 它将删除第一个 pencetile/quantile 和最后一个使用的元素功能:Min & Max 或与 .quantile (.1) 和。 val1

上的分位数 (.9)

输入:

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


使用:

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