2014-10-12 137 views
0

我有一個熊貓數據框,並根據數據框的列創建了一個字典。字典幾乎可以很好地生成,但唯一的問題是我試圖過濾出NaN值,但是我的代碼無法工作,所以在字典中有NaN作爲鍵。我的代碼如下:過濾來自字典鍵的空值 - Python

for key,row in mr.iterrows(): 
    # With this line I try to filter out the NaN values but it doesn't work 
    if pd.notnull(row['Company nameC']) and pd.notnull(row['Company nameA']) and pd.notnull(row['NEW ID']) : 
     newppmr[row['NEW ID']]=row['Company nameC'] 

輸出是:

defaultdict(<type 'list'>, {nan: '1347 PROPERTY INS HLDGS INC', 1.0: 'AFLAC INC', 2.0: 'AGCO CORP', 3.0: 'AGL RESOURCES INC', 4.0: 'INVESCO LTD', 5.0: 'AK STEEL HOLDING CORP', 6.0: 'AMN HEALTHCARE SERVICES INC', nan: 'FOREVERGREEN WORLDWIDE CORP' 

所以,我不知道如何過濾器出來的NaN值的,什麼是錯我的代碼。

編輯:

我的熊貓數據幀的一個例子是:

 CUSIP   Company nameA A�O  NEW ID Company nameC 
42020 98912M201  NaN    NaN  NaN  ZAP 
42021 989063102  NaN    NaN  NaN  ZAP.COM CORP 
42022 98919T100  NaN    NaN  NaN  ZAZA ENERGY CORP 
42023 98876R303  NaN    NaN  NaN  ZBB ENERGY CORP 

回答

1

粘貼一個例子 - 如何刪除從你的字典裏 「男」 鍵:

讓我們創建字典'nan'鍵(數字陣列中的NaN)

>>> a = float("nan") 
>>> b = float("nan") 
>>> d = {a: 1, b: 2, 'c': 3} 
>>> d 
{nan: 1, nan: 2, 'c': 3} 

現在,我們刪除所有'南'鍵

>>> from math import isnan 
>>> c = dict((k, v) for k, v in d.items() if not (type(k) == float and isnan(k))) 
>>> c 
{'c': 1} 

其他情況下,工作正常。也許我錯過了什麼?

In [1]: import pandas as pd 

In [2]: import numpy as np 

In [3]: df = pd.DataFrame({'a':[1,2,3,4,np.nan],'b':[np.nan,np.nan,np.nan,5,np.nan]}) 

In [4]: df 
Out[4]: 
    a b 
0 1 NaN 
1 2 NaN 
2 3 NaN 
3 4 5 
4 NaN NaN 

In [5]: for key, row in df.iterrows(): print pd.notnull(row['a']) 
True 
True 
True 
True 
False 

In [6]: for key, row in df.iterrows(): print pd.notnull(row['b']) 
False 
False 
False 
True 
False 

In [7]: x = {} 

In [8]: for key, row in df.iterrows(): 
    ....:  if pd.notnull(row['b']) and pd.notnull(row['a']): 
    ....:   x[row['b']]=row['a'] 
    ....:   

In [9]: x 
Out[9]: {5.0: 4.0} 
+0

我明白了,但我想知道我的代碼有什麼問題,並在插入字典之前過濾nan。謝謝你給我的想法! – CreamStat 2014-10-12 08:39:39

+0

這很奇怪。我已經創建並且與您的示例相似,並且工作正常。 – soerium 2014-10-12 09:25:53