在极坐标中实现频率编码

问题描述 投票:0回答:1

我想用它们的出现频率来替换类别。我的数据帧是惰性的,目前如果不遍历整个数据两次,然后遍历一列来获取数据帧的长度,我就无法做到这一点。这是我的做法:

输入:

df = pl.DataFrame({"a": [1, 8, 3], "b": [4, 5, None], "c": ["foo", "bar", "bar"]}).lazy()
print(df.collect())
output:
shape: (3, 3)
┌─────┬──────┬─────┐
│ a   ┆ b    ┆ c   │
│ --- ┆ ---  ┆ --- │
│ i64 ┆ i64  ┆ str │
╞═════╪══════╪═════╡
│ 1   ┆ 4    ┆ foo │
│ 8   ┆ 5    ┆ bar │
│ 3   ┆ null ┆ bar │
└─────┴──────┴─────┘

所需输出:

shape: (3, 3)
┌─────┬──────┬────────────────────┐
│ a   ┆ b    ┆ c                  │
│ --- ┆ ---  ┆ ---                │
│ i64 ┆ i64  ┆ str                │
╞═════╪══════╪════════════════════╡
│ 1   ┆ 4    ┆ 0.3333333333333333 │
│ 8   ┆ 5    ┆ 0.6666666666666666 │
│ 3   ┆ null ┆ 0.6666666666666666 │
└─────┴──────┴────────────────────┘

转换代码:

l = df.select("c").collect().shape[0]
rep = df.group_by("c").len().collect().with_columns(pl.col("len")/l).lazy()
df_out = df.with_context(rep.select(pl.all().name.prefix("context_"))).with_columns(pl.col("c").replace(pl.col("context_c"), pl.col("context_len"))).collect()
print(df_out)
output:
shape: (3, 3)
┌─────┬──────┬────────────────────┐
│ a   ┆ b    ┆ c                  │
│ --- ┆ ---  ┆ ---                │
│ i64 ┆ i64  ┆ str                │
╞═════╪══════╪════════════════════╡
│ 1   ┆ 4    ┆ 0.3333333333333333 │
│ 8   ┆ 5    ┆ 0.6666666666666666 │
│ 3   ┆ null ┆ 0.6666666666666666 │
└─────┴──────┴────────────────────┘

如您所见,我正在收集 2 倍完整的数据,并且在单个列上收集了一次。我可以做得更好吗?

python-polars
1个回答
0
投票

您可以首先使用

pl.Expr.value_counts()
获取频率的 LazyFrame,可以将其连接到
df
。您仍然需要对列进行一些重命名/删除。

freqs = (
    df
    .select(pl.col("c").value_counts())
    .unnest("c")
    .with_columns(pl.col("count") / pl.col("count").sum())
)

df.join(freqs,on="c",how="left").drop("c").rename({"count": "c"}).collect()
shape: (3, 3)
┌─────┬──────┬──────────┐
│ a   ┆ b    ┆ c        │
│ --- ┆ ---  ┆ ---      │
│ i64 ┆ i64  ┆ f64      │
╞═════╪══════╪══════════╡
│ 1   ┆ 4    ┆ 0.333333 │
│ 8   ┆ 5    ┆ 0.666667 │
│ 3   ┆ null ┆ 0.666667 │
└─────┴──────┴──────────┘
© www.soinside.com 2019 - 2024. All rights reserved.