获得极地百分比计数的最佳方法



我经常需要计算变量的百分比计数。例如

下面的数据框
df = pl.DataFrame({"person": ["a", "a", "b"], 
"value": [1, 2, 3]})

我想返回一个像这样的数据帧:

tbody> <<tr>b
personpercent
0.667
0.333

polars.count将在这里提供帮助。当不带参数调用时,polars.count返回特定上下文中的行数。

(
df
.groupby("person")
.agg([pl.count().alias("count")])
.with_columns((pl.col("count") / pl.sum("count")).alias("percent_count"))
)
shape: (2, 3)
┌────────┬───────┬───────────────┐
│ person ┆ count ┆ percent_count │
│ ---    ┆ ---   ┆ ---           │
│ str    ┆ u32   ┆ f64           │
╞════════╪═══════╪═══════════════╡
│ a      ┆ 2     ┆ 0.666667      │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ b      ┆ 1     ┆ 0.333333      │
└────────┴───────┴───────────────┘

使用Series方法.value_counts:

import polars as pl
df = pl.DataFrame({
'person': ['a', 'a', 'b', None, 'b'],
'value': [1, 2, 3, 2, 3]
})
df['person'].value_counts(sort=True).select(
pl.col('person'),
pl.col('counts'),
(pl.col('counts')/pl.col('counts').sum() * 100).round(2).alias('perc')
)

df['person'].value_counts(sort=True).select(
pl.col('person'),
pl.col('counts'),
pl.col('counts').apply(lambda x: x/df.shape[0]*100).round(2).alias('perc')
)

都将返回:

shape: (3, 3)
┌────────┬────────┬──────┐
│ person ┆ counts ┆ perc │
│ ---    ┆ ---    ┆ ---  │
│ str    ┆ u32    ┆ f64  │
╞════════╪════════╪══════╡
│ a      ┆ 2      ┆ 40.0 │
│ b      ┆ 2      ┆ 40.0 │
│ null   ┆ 1      ┆ 20.0 │
└────────┴────────┴──────┘

相关内容

最新更新