在Polars中解析带数字与SI前缀的字符串
解析带k/M/B后缀的字符串为数值(Polars实现)
针对包含千(k)、百万(M)、十亿(B)后缀的字符串列,这里提供两种高效的Polars实现方法,将其转换为对应的浮点数值:
方法一:正则提取+映射字典
通过正则提取后缀,结合映射字典匹配乘数,再与数字部分相乘得到结果:
import polars as pl df = pl.DataFrame(dict(j=['1.2', '1.2k', '1.2M', '-1.2B'])) # 定义后缀与对应乘数的映射 multiplier_map = { 'k': 1_000, 'M': 1_000_000, 'B': 1_000_000_000 } result_df = df.with_columns( # 提取后缀并映射乘数,无后缀则用1 pl.col('j').str.extract(r'([kMB])$', group_index=1).map_dict(multiplier_map, default=1) # 乘以去掉后缀后的数字转成的浮点数 * pl.col('j').str.replace(r'[kMB]$', '').cast(pl.Float64) .alias('j') ) print(result_df)
方法二:分支条件判断
通过when/then分支逻辑,针对不同后缀分别处理:
import polars as pl df = pl.DataFrame(dict(j=['1.2', '1.2k', '1.2M', '-1.2B'])) result_df = df.with_columns( pl.when(pl.col('j').str.ends_with('k')) .then(pl.col('j').str.replace('k', '').cast(pl.Float64) * 1_000) .when(pl.col('j').str.ends_with('M')) .then(pl.col('j').str.replace('M', '').cast(pl.Float64) * 1_000_000) .when(pl.col('j').str.ends_with('B')) .then(pl.col('j').str.replace('B', '').cast(pl.Float64) * 1_000_000_000) .otherwise(pl.col('j').cast(pl.Float64)) .alias('j') ) print(result_df)
两种方法执行后都会得到目标格式的DataFrame:
shape: (4, 1) ┌───────────┐ │ j │ │ --- │ │ f64 │ ╞═══════════╡ │ 1.2 │ │ 1200.0 │ │ 1.2e6 │ │ -1.2000e9 │ └───────────┘
内容的提问来源于stack exchange,提问作者levant pied
相关产品推荐
相关产品推荐

