我经常需要计算变量的百分比计数。例如
下面的数据框df = pl.DataFrame({"person": ["a", "a", "b"],
"value": [1, 2, 3]})
我想返回一个像这样的数据帧:
person | percent | 0.667 | b
---|---|
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 │
└────────┴────────┴──────┘