我如何使用 pandas dataframe to_dict with float32 而无需额外的浮点数
How can I use pandas dataframe to_dict with float32 without additional float decimals
我想使用 dtype='float32'
(它可能是一个 numpy dtype => np.float32
)而不是 dtype='float64'
来减少我的 pandas 数据帧的内存使用,因为我必须处理 hugh pandas 数据帧。
有一次,我想用 '.to_dict(orient='records')'
提取一个 python 列表,以便为每一行获取一个字典。
在这种情况下,我会得到额外的小数位,这可能是基于s.th这样的:
Is floating point math broken?
如何投射日期/更改类型等以获得与 float64
相同的结果(参见示例片段)?
import pandas as pd
_data = {'col1': [1.45123, 1.64123], 'col2': [0.1, 0.2]}
_test = pd.DataFrame(_data).astype(dtype='float64')
print(f"{_test=}")
print(f"{_test.round(1)=}")
print(f"{_test.to_dict(orient='records')=}")
print(f"{_test.round(1).to_dict(orient='records')=}")
float64
输出:
_test= col1 col2
0 1.45123 0.1
1 1.64123 0.2
_test.round(1)= col1 col2
0 1.5 0.1
1 1.6 0.2
_test.to_dict(orient='records')=[{'col1': 1.45123, 'col2': 0.1}, {'col1': 1.64123, 'col2': 0.2}]
_test.round(1).to_dict(orient='records')=[{'col1': 1.5, 'col2': 0.1}, {'col1': 1.6, 'col2': 0.2}]
import pandas as pd
_data = {'col1': [1.45123, 1.64123], 'col2': [0.1, 0.2]}
_test = pd.DataFrame(_data).astype(dtype='float32')
print(f"{_test=}")
print(f"{_test.round(1)=}")
print(f"{_test.to_dict(orient='records')=}")
print(f"{_test.round(1).to_dict(orient='records')=}")
float32
输出:
_test= col1 col2
0 1.45123 0.1
1 1.64123 0.2
_test.round(1)= col1 col2
0 1.5 0.1
1 1.6 0.2
_test.to_dict(orient='records')=[{'col1': 1.4512300491333008, 'col2': 0.10000000149011612}, {'col1': 1.6412299871444702, 'col2': 0.20000000298023224}]
_test.round(1).to_dict(orient='records')=[{'col1': 1.5, 'col2': 0.10000000149011612}, {'col1': 1.600000023841858, 'col2': 0.20000000298023224}]
管理浮点表示有some limitation
例如
使用 to_dict() 函数从 numpy 表示切换到 python 本机 float 表示,这意味着某种翻译。不管你使用的精度如何,一些小的信息都会丢失。
对于 no-lossy 转换,您必须在 之前 to_dict() 使用as_type() 函数:
_data = {'col1': [1.45123, 1.64123], 'col2': [0.1, 0.2]}
_test = pd.DataFrame(_data).astype(dtype='float32')
_test.round(1).astype('str').to_dict(orient='records')
_test.round(1).astype('str').to_dict(orient='records')=[{'col1': '1.5', 'col2': '0.1'}, {'col1': '1.6', 'col2': '0.2'}]
替代方法可以是 decimal 格式。
我想使用 dtype='float32'
(它可能是一个 numpy dtype => np.float32
)而不是 dtype='float64'
来减少我的 pandas 数据帧的内存使用,因为我必须处理 hugh pandas 数据帧。
有一次,我想用 '.to_dict(orient='records')'
提取一个 python 列表,以便为每一行获取一个字典。
在这种情况下,我会得到额外的小数位,这可能是基于s.th这样的:
Is floating point math broken?
如何投射日期/更改类型等以获得与 float64
相同的结果(参见示例片段)?
import pandas as pd
_data = {'col1': [1.45123, 1.64123], 'col2': [0.1, 0.2]}
_test = pd.DataFrame(_data).astype(dtype='float64')
print(f"{_test=}")
print(f"{_test.round(1)=}")
print(f"{_test.to_dict(orient='records')=}")
print(f"{_test.round(1).to_dict(orient='records')=}")
float64
输出:
_test= col1 col2
0 1.45123 0.1
1 1.64123 0.2
_test.round(1)= col1 col2
0 1.5 0.1
1 1.6 0.2
_test.to_dict(orient='records')=[{'col1': 1.45123, 'col2': 0.1}, {'col1': 1.64123, 'col2': 0.2}]
_test.round(1).to_dict(orient='records')=[{'col1': 1.5, 'col2': 0.1}, {'col1': 1.6, 'col2': 0.2}]
import pandas as pd
_data = {'col1': [1.45123, 1.64123], 'col2': [0.1, 0.2]}
_test = pd.DataFrame(_data).astype(dtype='float32')
print(f"{_test=}")
print(f"{_test.round(1)=}")
print(f"{_test.to_dict(orient='records')=}")
print(f"{_test.round(1).to_dict(orient='records')=}")
float32
输出:
_test= col1 col2
0 1.45123 0.1
1 1.64123 0.2
_test.round(1)= col1 col2
0 1.5 0.1
1 1.6 0.2
_test.to_dict(orient='records')=[{'col1': 1.4512300491333008, 'col2': 0.10000000149011612}, {'col1': 1.6412299871444702, 'col2': 0.20000000298023224}]
_test.round(1).to_dict(orient='records')=[{'col1': 1.5, 'col2': 0.10000000149011612}, {'col1': 1.600000023841858, 'col2': 0.20000000298023224}]
管理浮点表示有some limitation
例如
使用 to_dict() 函数从 numpy 表示切换到 python 本机 float 表示,这意味着某种翻译。不管你使用的精度如何,一些小的信息都会丢失。
对于 no-lossy 转换,您必须在 之前 to_dict() 使用as_type() 函数:
_data = {'col1': [1.45123, 1.64123], 'col2': [0.1, 0.2]}
_test = pd.DataFrame(_data).astype(dtype='float32')
_test.round(1).astype('str').to_dict(orient='records')
_test.round(1).astype('str').to_dict(orient='records')=[{'col1': '1.5', 'col2': '0.1'}, {'col1': '1.6', 'col2': '0.2'}]
替代方法可以是 decimal 格式。