Pandas从数据帧中的浮点运算中获取小数部分



如何从数据帧中的浮点(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并转换为integers:

df['decimal'] = (np.modf(df['dollars'])[0] * 100).astype(int)

split通过.:

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格式,则需要第二个解决方案-输出为strings:

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

或者,你可以从美元的int部分减去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

编辑:根据对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

或者,这可以在使用zfill之后完成,如果我们已经将小数部分作为int:

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

最新更新