2015-11-17 28 views
1

說我在python中有一個列表:a = [1,2,3,4,None]。假設我只想對不等於None的元素運行sklearn.preprocessing.scale。直接在列表中運行此功能會給出錯誤消息。僅在非none列表的元素上運行函數

有沒有辦法做到這一點,而不必手動做到這一點?我想要的功能與pandas中的.fillna()方法類似,您可以在忽略非null元素的數據框上運行函數,然後再替換它們。謝謝。

+2

爲什麼不過濾列表,然後運行該功能? – axiom

回答

0

我不熟悉sklearn.preprocessing.scale(),但它似乎是一個for循環應該工作:

for i in a: 
    if i is not None: 
     #your code here# 
2
result = sklearn.preprocessing.scale(filter(None,a)) 

應該做的正是你所要求的(以及過濾掉任何falsey值)

注意,這隻會如果你想爲一個一維列表

我想工作與標量和諾內斯原單回

r = iter(result) #result from above 
my_new_a = [None if not v else next(r) for v in a] 
+0

但是不會過濾也刪除列表中的空元素?我想讓他們留在原來的位置。 – Alex

+0

a沒有變化... –

+0

@PeterDeGlopper我幾乎把這樣的東西,但認爲不能是OP想要的東西。 .. –

3

如果您使用sklearn,沒準你可能要與numpy的陣列來工作,而不是Python列表:

>>> x = np.array([1, 2, 3, 4, None], dtype=float) 
>>> ix = ~np.isnan(x) 
>>> x[ix] = sklearn.preprocessing.scale(x[ix]) 
>>> x 
array([-1.34164079, -0.4472136 , 0.4472136 , 1.34164079,   nan]) 
+0

謝謝;這非常有幫助。 – Alex

相關問題