2014-10-12 134 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