将 Python 系列字符串转换为带 18 位小数的浮点数
Convert Python Series of strings into float with 18 decimals
我有以下pandas系列:
my_series = ['150000000000000000000000', '45064744242514231410', '2618611848503168287542', '7673975728717793369']
列表中的每个数字都有 18 位小数(在查看任何格式之前,这决定了它到底是什么数字)。
my_series[0]
,因此,是 150,000.000000000000000000(十五万)。
my_series[1]
,因此,是 45.064744242514231410(四十五...)。
以此类推
我基本上希望 Python 识别字符串并将它们转换为正确的浮点数,以便我稍后使用该系列进行计算。
我不需要打印正确格式的数字,而是让 Pythoin 识别它是 150,000 而不是 1,500,000,000 等等。
my_series[2]
的正确浮点数示例:
2,618.61
我当前的代码:
[float("{:.18f}".format(int(item) for item in my_series))]
这会产生以下错误:
TypeError: unsupported format string passed to generator.__format__
如何根据我的上述要求格式化 Series 中的字符串并获得正确的浮点数?
经过几次迭代,我想我明白了 OP 的目的,所以我改变了我的例子。 OP 似乎并不担心精度损失并且会出现值错误(可能是由于作为系列的一部分出现的无效字段)。我通过添加一些故意伪造的输入修改了我的示例,使其接近 Pandas 中的情况。
my_series = [
"not a number",
"",
"150000000000000000000000",
"45064744242514231410",
"2618611848503168287542",
"7673975728717793369",
]
def convert_to_float(number):
float_string = None
my_float = None
try:
float_string = f"{int(number[:-18])}.{number[-18:]}"
my_float = float(float_string)
except ValueError as e:
print(e)
return None
return my_float
numbers = list(map(convert_to_float, my_series))
for num in numbers:
if num:
print(f"{num :.18f}")
您可以将字符串转换为浮点数,然后应用格式设置。
my_series = ['150000000000000000000000', '45064744242514231410',
'2618611848503168287542', '7673975728717793369']
["{:,.2f}".format(float(item)/10**18) for item in my_series]
['150,000.00', '45.06', '2,618.61', '7.67']
请注意,这在将字符串转换为浮点数时可能会损失一些精度。
如果这对您来说是个问题,那么您可能需要使用
- 打印时将整数部分和小数部分分开并合并
- 使用十进制class
我有以下pandas系列:
my_series = ['150000000000000000000000', '45064744242514231410', '2618611848503168287542', '7673975728717793369']
列表中的每个数字都有 18 位小数(在查看任何格式之前,这决定了它到底是什么数字)。
my_series[0]
,因此,是 150,000.000000000000000000(十五万)。
my_series[1]
,因此,是 45.064744242514231410(四十五...)。
以此类推
我基本上希望 Python 识别字符串并将它们转换为正确的浮点数,以便我稍后使用该系列进行计算。 我不需要打印正确格式的数字,而是让 Pythoin 识别它是 150,000 而不是 1,500,000,000 等等。
my_series[2]
的正确浮点数示例:
2,618.61
我当前的代码:
[float("{:.18f}".format(int(item) for item in my_series))]
这会产生以下错误:
TypeError: unsupported format string passed to generator.__format__
如何根据我的上述要求格式化 Series 中的字符串并获得正确的浮点数?
经过几次迭代,我想我明白了 OP 的目的,所以我改变了我的例子。 OP 似乎并不担心精度损失并且会出现值错误(可能是由于作为系列的一部分出现的无效字段)。我通过添加一些故意伪造的输入修改了我的示例,使其接近 Pandas 中的情况。
my_series = [
"not a number",
"",
"150000000000000000000000",
"45064744242514231410",
"2618611848503168287542",
"7673975728717793369",
]
def convert_to_float(number):
float_string = None
my_float = None
try:
float_string = f"{int(number[:-18])}.{number[-18:]}"
my_float = float(float_string)
except ValueError as e:
print(e)
return None
return my_float
numbers = list(map(convert_to_float, my_series))
for num in numbers:
if num:
print(f"{num :.18f}")
您可以将字符串转换为浮点数,然后应用格式设置。
my_series = ['150000000000000000000000', '45064744242514231410',
'2618611848503168287542', '7673975728717793369']
["{:,.2f}".format(float(item)/10**18) for item in my_series]
['150,000.00', '45.06', '2,618.61', '7.67']
请注意,这在将字符串转换为浮点数时可能会损失一些精度。 如果这对您来说是个问题,那么您可能需要使用
- 打印时将整数部分和小数部分分开并合并
- 使用十进制class