如何选择具有某一列上最小值的行。

huangapple go评论54阅读模式
英文:

How to select a row with minimum value over some other column

问题

# 选择基于另一列聚合的最小值的数据框行
# 例如

a = pl.DataFrame({'a': [1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3], 'b': [10, 5, 10, 6, 5, 4, 5, 30, 25, 24, 30, 30], 'c': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]})
print(a)

shape: (12, 3)
┌─────┬─────┬─────┐
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 1 ┆ 10 ┆ 1 │
│ 1 ┆ 5 ┆ 2 │
│ 1 ┆ 10 ┆ 3 │
│ 2 ┆ 6 ┆ 4 │
│ 2 ┆ 5 ┆ 5 │
│ 2 ┆ 4 ┆ 6 │
│ 2 ┆ 5 ┆ 7 │
│ 3 ┆ 30 ┆ 8 │
│ 3 ┆ 25 ┆ 9 │
│ 3 ┆ 24 ┆ 10 │
│ 3 ┆ 30 ┆ 11 │
│ 3 ┆ 30 ┆ 12 │
└─────┴─────┴─────┘

我需要以下数据框

shape: (3, 3)
┌─────┬─────┬─────┐
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 1 ┆ 5 ┆ 2 │
│ 2 ┆ 4 ┆ 6 │
│ 3 ┆ 24 ┆ 10 │
└─────┴─────┴─────┘

所以它就像是按照 'a' 进行分组,然后取 'b' 的最小值,但我需要选择整行的最小值。

谢谢。
英文:

How to select a rows from dataframe based on minimum value in one column aggregated over another column. For example

a = pl.DataFrame({'a': [1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3], 'b': [10, 5, 10, 6, 5, 4, 5, 30, 25, 24, 30, 30], 'c': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]})
print(a)
-----------------
shape: (12, 3)
┌─────┬─────┬─────┐
│ a   ┆ b   ┆ c   │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 1   ┆ 10  ┆ 1   │
│ 1   ┆ 5   ┆ 2   │
│ 1   ┆ 10  ┆ 3   │
│ 2   ┆ 6   ┆ 4   │
│ 2   ┆ 5   ┆ 5   │
│ 2   ┆ 4   ┆ 6   │
│ 2   ┆ 5   ┆ 7   │
│ 3   ┆ 30  ┆ 8   │
│ 3   ┆ 25  ┆ 9   │
│ 3   ┆ 24  ┆ 10  │
│ 3   ┆ 30  ┆ 11  │
│ 3   ┆ 30  ┆ 12  │
└─────┴─────┴─────┘

I need the following dataframe

shape: (3, 3)
┌─────┬─────┬─────┐
│ a   ┆ b   ┆ c   │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 1   ┆ 5   ┆ 2   │
│ 2   ┆ 4   ┆ 6   │
│ 3   ┆ 24  ┆ 10  │
└─────┴─────┴─────┘

so it's like groupby(by='a'), them min('b'), but I need to select entire row with minimum b.

Thanks.

答案1

得分: 2

看起来像是一个 .filter + .over

df.filter(pl.col('b') == pl.min('b').over('a'))
形状: (3, 3)
┌─────┬─────┬─────┐
 a    b    c   
 ---  ---  --- 
 i64  i64  i64 
╞═════╪═════╪═════╡
 1    5    2   
 2    4    6   
 3    24   10  
└─────┴─────┴─────┘

要处理重复值,你可以添加 .unique(subset='a')

它也可以写成一个 .groupby

(df.groupby('a')
   .agg(
      pl.col('b', 'c').filter(pl.col('b') == pl.min('b')).first()
   )
)
英文:

Looks like a .filter + .over

df.filter(pl.col('b') == pl.min('b').over('a'))
shape: (3, 3)
┌─────┬─────┬─────┐
│ a   ┆ b   ┆ c   │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 1   ┆ 5   ┆ 2   │
│ 2   ┆ 4   ┆ 6   │
│ 3   ┆ 24  ┆ 10  │
└─────┴─────┴─────┘

To handle duplicates you could add .unique(subset='a')

It could also be written as a .groupby:

(df.groupby('a')
   .agg(
      pl.col('b', 'c').filter(pl.col('b') == pl.min('b')).first()
   )
)

huangapple
  • 本文由 发表于 2023年6月15日 12:49:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/76479208.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定