Python
在 Python Quantopian 中刪除 NaN 值
我正在嘗試在 numpy 中製作直方圖,但 numpy.histogram 似乎真的很討厭 NaN 值。我嘗試以三種不同的方式從名為 data 的列表中刪除 NaN 值,但 Quantopian 不允許我使用這三種方式中的任何一種:1.) TypeError: 只有具有一個元素的整數數組可以轉換為索引
data = data[~np.isnan(data)]
2.) 然後我嘗試使用 pandas.dropna() 並拋出:ValueError:具有多個元素的數組的真值是不明確的。使用 a.any() 或 a.all()
datapd = pd.Series(data) hist, bins = np.histogram(datapd.dropna(), density=True, bins = 'auto')
3.)當這不起作用時,我嘗試自己刪除它們:
i = 0 while(i < len(y)): if(float('nan') == y[i]): y[i] = 0 i = i + 1
它拋出了同樣的錯誤:ValueError:具有多個元素的數組的真值不明確。使用 a.any() 或 a.all()
你如何刪除 quantopian 中的 NaN 值?我在 python 控制台中嘗試了這些方法並且它起作用了我不知道為什麼它在 quantopian 中不起作用。
一般來說,您可能應該看看以下答案:
但是,我想談談第 3 點。
- 您應該使用
numpy
來檢查NaN
s,而不是使用等號運算符。np.isnan(...)
.- 你不應該使用
while
循環。這是非常不合時宜的。- 你的 if 語句不應該有括號。
- 部分的縮進
while
應該使這個腳本失敗。- 請記住,您正在使用行。如果您的程式碼按照您展示的方式實現,則不應出現模棱兩可的真值錯誤。
也許你寫了這樣的東西:
i = 0 while(i < len(y)): if np.isnan(y[i]): y[i] = 0 i = i + 1
這會產生:
ValueError:具有多個元素的數組的真值不明確。使用 a.any() 或 a.all()
這裡發生的是 if 語句獲取一個布爾列表,並且不知道如何處理它。當所有這些都是真的時,它是真的嗎?或者,當其中任何一個為真時,它是真的嗎?您可以按如下方式解決它:
i = 0 while(i < len(y)): if np.isnan(y[i]).any(): y[i] = 0 i = i + 1
或者更多pythonic:
for i in range(0, len(y)): if np.isnan(y[i]).any(): y[i] = 0
還要注意零分配。我不知道 pandas 數據幀是如何實現的,但通常使用普通集合類型,您會用數字零 (0) 替換一行。
如果我們不使用特殊的 pandas 數據框,那隻是我會選擇的列表:
y = [row for row in y if not np.isnan(row).any()]
…如果您想刪除具有任何
NaN
值的行。或者,如果您只是想將任何元素設置
NaN
為零:y = [[0 if np.isnan(elm) else elm for elm in row] for row in y]
有測試數據:
import numpy as np y = [[0,0],[1,1],[2,float('nan')],[3,3]] print(y) x = [row for row in y if not np.isnan(row).any()] print(x) z = [[0 if np.isnan(elm) else elm for elm in row] for row in y] print(z)
這會產生以下輸出:
[[0, 0], [1, 1], [2, nan], [3, 3]] [[0, 0], [1, 1], [3, 3]] [[0, 0], [1, 1], [2, 0], [3, 3]]