英文:
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()
)
)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论