2017-05-09 105 views
1

我是python的新手,我正在对两个相似的SFrame执行基本的EDA分析。我有一个字典作为我的两列,我试图找出每个字典的最大值是否相同。最后,我想总结一下Value_Match列,以便我可以知道有多少个值匹配,但是我收到了一个令人讨厌的错误,但我一直无法找到源代码。奇怪的是,我对两个SFrame都使用了相同的方法,只有其中一个给我这个错误,而不是另一个。在Python中使用sum()时出错SFrame

我试图这里给出,但同样的错误一直坚持以不同的方式计算max_func:getting-key-with-maximum-value-in-dictionary

我已经检查了列中的任何可能的NaN值,但没有发现任何人。

我一直坚持这一段时间,任何帮助将不胜感激。谢谢!

代码:

def max_func(d): 
    v=list(d.values()) 
    k=list(d.keys()) 
    return k[v.index(max(v))] 

sf['Max_Dic_1'] = sf['Dic1'].apply(max_func) 
sf['Max_Dic_2'] = sf['Dic2'].apply(max_func) 
sf['Value_Match'] = sf['Max_Dic_1'] == sf['Max_Dic_2'] 
sf['Value_Match'].sum() 

错误:

RuntimeError        Traceback (most recent call last) 
<ipython-input-70-f406eb8286b3> in <module>() 
----> 1 x = sf['Value_Match'].sum() 
    2 y = sf.num_rows() 
    3 
    4 print x 
    5 print y 

C:\Users\rakesh\Anaconda2\lib\site- 
packages\graphlab\data_structures\sarray.pyc in sum(self) 
2216   """ 
2217   with cython_context(): 
-> 2218    return self.__proxy__.sum() 
2219 
2220  def mean(self): 

C:\Users\rakesh\Anaconda2\lib\site-packages\graphlab\cython\context.pyc in 
__exit__(self, exc_type, exc_value, traceback) 
47    if not self.show_cython_trace: 
48     # To hide cython trace, we re-raise from here 
---> 49     raise exc_type(exc_value) 
50    else: 
51     # To show the full trace, we do nothing and let 
exception propagate 

RuntimeError: Runtime Exception. Exception in python callback function 
evaluation: 
ValueError('max() arg is an empty sequence',): 
Traceback (most recent call last): 
File "graphlab\cython\cy_pylambda_workers.pyx", line 426, in 
graphlab.cython.cy_pylambda_workers._eval_lambda 
File "graphlab\cython\cy_pylambda_workers.pyx", line 169, in 
graphlab.cython.cy_pylambda_workers.lambda_evaluator.eval_simple 
File "<ipython-input-63-b4e3c0e28725>", line 4, in max_func 
ValueError: max() arg is an empty sequence 
+0

错误不在'sum'本身。 'max_func'应用懒惰,问题是对于一个emty字典,没有'max' ... –

回答

0

为了调试这个问题,你一定要看堆栈跟踪。在最后一行,我们看到:

File "<ipython-input-63-b4e3c0e28725>", line 4, in max_func 
ValueError: max() arg is an empty sequence

的Python这样说,你的目标是与没有元素计算最大列表。如果字典是空的,则是这种情况。因此,在其中一个数据框中,可能有一个空字典{}

问题是如果字典为空,该怎么办。您可能决定将None退回该案例。

不过你写的代码太复杂了。一个更简单和更高效的算法将是:

def max_func(d): 
    if d: 
     return max(d,key=d.get) 
    else: 
     # or return something if there is no element in the dictionary 
     return None
+0

谢谢你的帮助:) –