Pandas 从数据框中的浮点数获取小数部分

问题描述 投票:0回答:4

如何从数据框中的浮点数(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
python-3.x pandas dataframe floating-point
4个回答
7
投票

使用

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

5
投票

替代方案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)

3
投票

如果你知道你有两位小数..只需使用

%
广播

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

0
投票

在不使用外部函数(即单独使用 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  │
# └─────────┴─────────────────┴───────┘
© www.soinside.com 2019 - 2024. All rights reserved.