我是python的新手,我在两个类似的SFrame上执行基本的EDA分析。我有一个字典作为我的两个列,我试图找出每个字典的最大值是否相同。最后,我想总结一下Value_Match列,以便我可以知道有多少值匹配,但我得到了一个令人讨厌的错误,而我却找不到源代码。奇怪的是我对两个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 :(得分: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