Python如何将十六进制的浮点数转换为十进制数

3
我已经使用pandas从csv文件中读取了一些数据。该数据不完整,因此包含许多NaN值。我想向数据添加一列来将十六进制值转换为十进制值。不幸的是,具有十六进制值的列都被读取为浮点数,而不是字符串,因为它们恰好具有这些值。 示例数据
   val
0 20.0
1  nan
2 20.0

在Python中将十六进制转换为十进制的简单方法似乎是:int('20.0',16),这应该得到32

然而,由于这是Pandas,我无法将值转换为整数,或者至少我一直收到错误提示。

我的当前代码如下:

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个回答

4
你可以掩盖感兴趣的行并进行双重转换,然后调用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) 进行强制转换为整数,然后通过调用 .astype(str) 转换为 str
然后我们调用 apply 进行十六进制转换,并将所有结果分配给新列。
请注意,由于存在 NaN,新列的 dtype 将是 float。您无法混合使用 intfloat 正如 @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

3
使用int进行转换会丢失数字的任何小数部分。从十六进制浮点字符串正确的转换方式是float.fromhex(s) - jasonharper
@jasonharper 已经添加了你的建议 - EdChum
太棒了!非常感谢。我已经找到了dropna函数,但是忘记了Python如何处理删除的值。真是个好解决方案! - Eric Jensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接