如何从数据帧中的浮点(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
通过.
:
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
或者,你可以从美元的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