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

8

如何从数据框的float(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

仅因为您希望结果具有前导零填充,所以您不希望对于 196.09 返回 09。您可以选择获得字符串结果(而不是整数,速度慢,无法进一步进行算术运算),或者(更好的方式)可以使用整数结果,只需记住在显示时使用 f'{number:02d}' 或者 '{:02d}'.format。或者简单地设置 pd.options.display.float_format = '{:02d}'.format,或参见如何使用列的格式化字符串显示浮点数的 pandas DataFrame? - smci
3个回答

7
使用numpy.modf函数,乘以100并转换为整数
df['decimal'] = (np.modf(df['dollars'])[0] * 100).astype(int)

或者通过"."进行拆分:
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 格式,需要使用第二种解决方案 - 输出为 字符串

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

我对 196.69 进行了一个小改动,如果我有 196.09,我需要的是 09,而不是 9,该如何解决? - Learn

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,然后乘以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

编辑: 根据问题的编辑,似乎需要将小数部分显示为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

或者,如果我们已经将小数部分转换为整数,那么可以使用 zfill 在处理后进行格式化:
df['decimal'] = df['decimal'].astype(str).str.zfill(2)

我对196.69做了一个小改动,如果我有196.09,我需要的是09而不是9,如何解决? - Learn
请查看我的编辑。在这种情况下,它必须作为字符串显示。 - sacuL

3
如果您知道有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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接