在polars中解析带有数字和国际单位制前缀的字符串
假设我有一个这样的数据表:
>>> import polars
>>> df = polars.DataFrame(dict(j=['1.2', '1.2k', '1.2M', '-1.2B']))
>>> df
shape: (4, 1)
┌───────┐
│ j │
│ --- │
│ str │
╞═══════╡
│ 1.2 │
│ 1.2k │
│ 1.2M │
│ -1.2B │
└───────┘
我该如何处理上面的数据,以得到:
>>> df = polars.DataFrame(dict(j=[1.2, 1_200, 1_200_000, -1_200_000_000]))
>>> df
shape: (4, 1)
┌───────────┐
│ j │
│ --- │
│ f64 │
╞═══════════╡
│ 1.2 │
│ 1200.0 │
│ 1.2e6 │
│ -1.2000e9 │
└───────────┘
>>>
2 个回答
3
另一种和@RomanPekar提到的解决方案类似的方法是,直接用相应的国际单位制(SI)倍数来替换k
、M
和B
。
df.with_columns(
pl.col('j').str.strip_chars('kMB').cast(pl.Float32) *
(
pl.col('j')
.str.extract(r'(k|M|B)')
.replace({"k": 1e3, "M": 1e6, "B": 1e9}, default=1.0, return_dtype=pl.Float32)
)
)
3
你可以使用 str.extract()
和 str.strip_chars()
来分割字符串的不同部分,然后通过 Expr.replace()
加上 Expr.pow()
来获取结果的数字。
df.with_columns(
pl.col('j').str.strip_chars('KMB').cast(pl.Float32) *
pl.lit(10).pow(
pl.col('j').str.extract(r'(K|M|B)').replace(['K','M','B'],[3,6,9]).fill_null(0)
)
)
┌─────────────┐
│ j │
│ --- │
│ f64 │
╞═════════════╡
│ 1.2 │
│ 1200.000048 │
│ 1.2000e6 │
│ -1.2000e9 │
└─────────────┘