Python如何将浮点数作为十六进制转换为十进制
Posted
技术标签:
【中文标题】Python如何将浮点数作为十六进制转换为十进制【英文标题】:Python How to convert a float as hex to decimal 【发布时间】:2017-04-21 13:07:07 【问题描述】:我已经从带有 pandas 的 csv 文件中读取了一些数据。数据不完整,因此包含许多 nan 值。 我想在将十六进制值转换为十进制值的数据中添加一列。不幸的是,具有十六进制值的列都被读取为浮点数,而不是字符串,因为它们恰好具有这些值。 示例数据
val
0 20.0
1 nan
2 20.0
在python中将十六进制转换为十进制的简单方法似乎是:int('20.0',16)
,它应该产生32
。
但是,由于这是 pandas,我无法将值转换为 int,或者至少我不断收到错误说明。 我当前的代码是:
df['valdec'] = np.where(np.isnan(df['val']),
df['val'],
int(df['val'].astype(int).astype(str), 16))
这失败并出现错误:
ValueError: 无法将 NA 转换为整数
如果没有astype(int)
,则值为"20.0"
,无法转换。
使用 pandas 数据帧时,是否有另一种方法可以将浮点值解释为十六进制值并转换为十进制?
【问题讨论】:
如果我的回答解决了您的问题,那么您可以接受,我的回答左上角会有一个空的勾号,如果您需要进一步的内容,那么您需要评论并添加更多信息 【参考方案1】:您可以屏蔽感兴趣的行并进行双重转换并致电apply
:
In [126]:
df['valdec'] = df['val'].dropna().astype(int).astype(str).apply(lambda x: int(x, 16))
df
Out[126]:
val valdec
0 20.0 32.0
1 NaN NaN
2 20.0 32.0
所以首先我们调用dropna
来删除NaN
,这允许我们使用.astype(int)
转换为int
,然后通过调用.astype(str)
转换为str
。
然后我们在此调用apply
以转换为十六进制并将所有这些的结果分配给新列
请注意,新列的dtype
将为float
,因为NaN
的存在会强制执行此操作,您将无法混合使用int
s 和float
s
正如@jasonharper 所指出的,在此处转换为int
将丢失任何小数
部分所以更高精度的方法是使用float.fromhex
:
In [128]:
df['valdec'] = df['val'].astype(str).dropna().apply(lambda x: float.fromhex(x))
df
Out[128]:
val valdec
0 20.0 32.0
1 NaN NaN
2 20.0 32.0
【讨论】:
通过int
进行的转换当然会丢失数字的任何小数部分。十六进制浮点字符串的正确转换是float.fromhex(s)
。
@jasonharper 已添加您的建议
太棒了!非常感谢你。我找到了 dropna,但忘记了 python 如何处理丢弃的值。很好的解决方案!以上是关于Python如何将浮点数作为十六进制转换为十进制的主要内容,如果未能解决你的问题,请参考以下文章