我正在将一些代码从 迁移Pandas
到Polars
。我尝试使用cut
但polars
存在差异(没有bin
,所以我必须计算它)。
label
但我还是不明白极坐标的结果。
我必须使用比我想要的更多的标签才能获得相同的结果pandas
。
import numpy as np
import pandas as pd
import polars as pl
# Exemple de DataFrame Polars
data = {
"value": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
}
df_pl = pl.DataFrame(data)
# Convertir en DataFrame Pandas pour obtenir les breakpoints
df_pd = df_pl.to_pandas()
# Use returbins to get the breakpoints (from pandas)
df_pd["cut_label_pd"], breakpoints = pd.cut(df_pd["value"], 4, labels=["low", "medium", "hight", "very high"], retbins=True)
print(pl.from_pandas(df_pd))
shape: (10, 2)
┌───────┬──────────────┐
│ value ┆ cut_label_pd │
│ --- ┆ --- │
│ i64 ┆ cat │
╞═══════╪══════════════╡
│ 1 ┆ low │
│ 2 ┆ low │
│ 3 ┆ low │
│ 4 ┆ medium │
│ 5 ┆ medium │
│ 6 ┆ hight │
│ 7 ┆ hight │
│ 8 ┆ very high │
│ 9 ┆ very high │
│ 10 ┆ very high │
└───────┴──────────────┘
print(breakpoints)
# [ 0.991 3.25 5.5 7.75 10. ]
labels
有没有更好的方法?(注意中的值polars
cut
)
# Cut in polars
labels = ["don't use it", "low", "medium", "hight", "very high", "don't use it too"]
df_pl = df_pl.with_columns(
pl.col("value").cut(breaks=breakpoints, labels=labels).alias("cut_label_pl")
)
print(df_pl)
shape: (10, 2)
┌───────┬──────────────┐
│ value ┆ cut_label_pl │
│ --- ┆ --- │
│ i64 ┆ cat │
╞═══════╪══════════════╡
│ 1 ┆ low │
│ 2 ┆ low │
│ 3 ┆ low │
│ 4 ┆ medium │
│ 5 ┆ medium │
│ 6 ┆ hight │
│ 7 ┆ hight │
│ 8 ┆ very high │
│ 9 ┆ very high │
│ 10 ┆ very high │
└───────┴──────────────┘
简而言之,Polars 不需要 pandas
retbins
参数产生的那么多断点。Polars 的文档字符串labels
指出“标签数量必须等于切点数量加一”。由于我们有 4 个标签,因此我们需要 3 个断点。Polars 不需要 pandas 产生的第一个或最后一个断点。无需添加虚假标签,只需减少中断数量即可。您可以将现有代码从 更改为
pl.col("value").cut(breaks=breakpoints, ...)
,pl.col("value").cut(breaks=breakpoints[1:-1], ...)
然后删除两个“不要使用它”标签,这样会更好一些。但显然你不想依赖熊猫来计算一些均匀分布的箱子,所以让我们自己做吧!
从基线开始:
现在让我们计算这些中断。
pandas.cut
表示bins
定义 x 范围内等宽箱的数量。总之(如果你改变标签数量,它仍然有效)
祝愿你们从熊猫到北极的迁徙顺利!