我的 Polars DataFrame 中有一个Categorical
列,其值范围从“01”到“10”。当尝试通过以下方式将该列转换为数字表示形式时:
转换值未按预期映射(即“01”未映射为 1,依此类推),并且范围现在也从 0 到 9,不是1到10。decile
df
df.with_columns(pl.col('decile').cast(pl.Int8))
奇怪的是,无论列的原始值decile
是什么,它们总是会意外地映射到 [0, 9] 当将其转换为整数数据类型时。
我正在尝试将这些值转换为整数数据类型以用于绘图目的。
这是一个最小的可重现示例:
size = 1e3
df = pl.DataFrame({
"id": np.random.randint(50, size=int(size), dtype=np.uint16),
"amount": np.round(np.random.uniform(10, 100000, int(size)).astype(np.float32), 2),
"quantity": np.random.randint(1, 7, size=int(size), dtype=np.uint16),
})
df = (df
.groupby("id")
.agg(revenue=pl.sum("amount"), tot_quantity=pl.sum("quantity"))
)
df = (df.with_columns(
pl.col('revenue')
.qcut(10, labels=[f'q{i:02}' for i in range(10, 0, -1)])
.alias("decile")
))
如何使转换正确(正如人们期望的值被映射一样),并且与原始值处于相同的范围内?
pl.Categorical 上的第一次转换应该始终
pl.Utf8
首先是 string ( ) ,然后从此处从 string 转换为 int (在您的示例中,需要比直接转换更多的内容来分隔 )q
: