2017-04-21 177 views
3

我读过一些csv文件中的大熊猫数据。数据不完整,因此包含许多nan值。 我想向将十六进制值转换为十进制值的数据添加一列。不幸的是,具有十六进制值的列全部读取为浮点数,而不是字符串,因为它们恰好具有这些值。 实施例数据Python如何将十六进制浮点数转换为十进制

val 
0 20.0 
1 nan 
2 20.0 

简单的方式转换成十六进制在python为十进制似乎是:int('20.0',16),其应产生32

但是,既然这是熊猫我不能将值转换为int,或者至少我不断收到一个错误说明。 我当前的代码是:

df['valdec'] = np.where(np.isnan(df['val']), 
        df['val'], 
        int(df['val'].astype(int).astype(str), 16)) 

这失败,错误:

ValueError: Cannot convert NA to integer

而不astype(int)值为"20.0"不能被转换。 有没有另一种方法来解释浮点值作为十六进制值,并在使用熊猫数据框时转换为十进制?

+0

如果我的回答能够解决您的问题,那么你能接受的话,将会有我的答案左上方的空刻度,如果你需要的东西还那么你需要发表意见,并通过添加更多的信息 – EdChum

回答

2

可以掩盖的兴趣和双投行和调用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,这让我们通过调用转换为int使用.astype(int)然后转换为str.astype(str)

然后我们呼吁这个apply转换为十六进制和这一切的结果分配到新列

注意,新列的dtypefloatNaN存在强制执行这一点,你赢了“T能够具有和float小号

正如@jasonharper指出的int秒的混合物,浇注到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

+0

@jasonharper已添加您的建议 – EdChum

+0

精彩!非常感谢你。我找到了dropna,但忘了python如何处理掉落的值。好的解决方案 –

相关问题