如何从数据框中的浮点数(float64)中提取小数部分?(很常见的场景,但我在StackOverFlow中找不到解决方案)
注意:小心
196.09
,我需要09
,而不是9
。
示例数据框:
dollars Count
0 56.46 2
1 196.09 3
2 78.12 2
预期结果是2位小数:
decimal
0 46
1 09
2 12
numpy.modf
,乘以 100
并投射到 integer
s:
df['decimal'] = (np.modf(df['dollars'])[0] * 100).astype(int)
或
split
by .
:
df['decimal'] = df['dollars'].astype(str).str.split('.').str[1].astype(int)
print (df)
dollars Count decimal
0 56.46 2 46
1 196.69 3 68
2 78.12 2 12
编辑:如果需要
09
格式需要第二个解决方案 - 输出是string
s:
df['decimal'] = df['dollars'].astype(str).str.split('.').str[1]
print (df)
dollars Count decimal
0 56.46 2 46
1 196.09 3 09
2 78.12 2 12
替代方案1
另一种方法是将
dollars
转换为字符串,然后使用正则表达式提取 .
之后的所有内容:
df['decimal'] = df.dollars.astype(str).str.extract('\.(.*)').astype(int)
>>> df
dollars Count decimal
0 56.46 2 46
1 196.69 3 69
2 78.12 2 12
替代方案2
或者,您可以从美元的
dollars
部分减去 int
,然后乘以 100:
df['decimal'] = (df.dollars.sub(df.dollars.astype(int))).mul(100).astype(int)
>>> df
dollars Count decimal
0 56.46 2 46
1 196.69 3 68
2 78.12 2 12
编辑:根据对OP问题的编辑,似乎小数部分需要显示为2位小数(例如,它需要是
09
而不是9
)。在这种情况下,它必须显示为字符串,而不是 int
。如果省略,我上面概述的第一种方法仍然有效 astype(int)
:
df['decimal'] = df.dollars.astype(str).str.extract('\.(.*)')
>>> df
dollars Count decimal
0 56.46 2 46
1 196.09 3 09
2 78.12 2 12
或者,如果我们已经将小数部分作为 int,则可以在事后使用
zfill
来完成:
df['decimal'] = df['decimal'].astype(str).str.zfill(2)
如果你知道你有两位小数..只需使用
%
广播
s = df.dollars % 1 * 100
0 46.0
1 69.0
2 12.0
Name: dollars, dtype: float64
s.astype(int)
0 46
1 69
2 12
在不使用外部函数(即单独使用 Polars 表达式)的情况下,并且对符号敏感度具有鲁棒性,我们可以这样做:
import polars as pl
pl.DataFrame(
pl.Series("dollars", [56.46, 196.09, 78.12, -56.46])
).with_columns(
floored_dollars=pl.when(pl.col("dollars").ge(0))
.then(pl.col("dollars").floor())
.otherwise(pl.col("dollars").ceil())
).with_columns(cents=(pl.col("dollars") - pl.col("floored_dollars")).abs())
# shape: (4, 3)
# ┌─────────┬─────────────────┬───────┐
# │ dollars ┆ floored_dollars ┆ cents │
# │ --- ┆ --- ┆ --- │
# │ f64 ┆ f64 ┆ f64 │
# ╞═════════╪═════════════════╪═══════╡
# │ 56.46 ┆ 56.0 ┆ 0.46 │
# │ 196.09 ┆ 196.0 ┆ 0.09 │
# │ 78.12 ┆ 78.0 ┆ 0.12 │
# │ -56.46 ┆ -56.0 ┆ 0.46 │
# └─────────┴─────────────────┴───────┘