2017-04-21 220 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如何處理掉落的值。好的解決方案 –

相關問題