【问题标题】:Python Error: 'numpy.bool_' object is not iterablePython 错误:“numpy.bool_”对象不可迭代
【发布时间】:2013-07-02 20:09:01
【问题描述】:
def dailyTimeDistributionFeatures ( dailyCallDistribution_dictionary, missingValue = -999, lowSampleValue = -666, numberOfFeatures = 14, sampleSizeThreshold = 3 ):     
     featureSelection = {}
     for date in dailyCallDistribution_dictionary:
          date_timestruct = datetime.datetime.fromtimestamp(time.mktime(time.strptime(date, "%Y-%m-%d")))
          timeSample = dailyCallDistribution_dictionary[ date ]
          if len(timeSample) <= sampleSizeThreshold :
            if len(timeSample) == 0 :
               featureSelection[ date ] = [ date_timestruct.timetuple().tm_wday
                                          , int(date_timestruct.strftime('%W'))
                                          , date_timestruct.month ] + [missingValue] * (numberOfFeatures - 3)
            else :
               featureSelection[ date ] = [ date_timestruct.timetuple().tm_wday
                                          , int(date_timestruct.strftime('%W'))
                                          , date_timestruct.month ] + [lowSampleValue] * (numberOfFeatures - 3)
          else :    
               featureSelection[ date ] = [ date_timestruct.timetuple().tm_wday
                                          , int(date_timestruct.strftime('%W'))
                                          , date_timestruct.month
                                          , len( timeSample )
                                          # counts how many late night activities.
                                          , sum( Pandas.Series( timeSample ).apply( lambda x: (x>0) & (x <= 4) ).tolist() )
                                          , Pandas.Series( timeSample ).mean()
                                          , Pandas.Series( timeSample ).median() 
                                          , Pandas.Series( timeSample ).std() 
                                          , Pandas.Series( timeSample ).min()
                                          , Pandas.Series( timeSample ).max()
                                          , Pandas.Series( timeSample ).mad()
                                          , Pandas.Series( timeSample ).quantile(0.75) - Pandas.Series( timeSample ).quantile(0.25)
                                          , Pandas.Series( timeSample ).kurt() 
                                          , Pandas.Series( timeSample ).skew() 
                                          ]
     return Pandas.DataFrame( featureSelection, index = ['dayOfWeek', 'WeekOfYear', 'MonthOfYear', 
                                                         'Number of Calls', 'Number of Late Night Activities', 
                                                         'Average Time', 'Median of Time',
                                                         'Standard Deviation', 'Earliest Call',
                                                         'Latest Call', 'Mean Absolute Deviation',
                                                         'Interquartile Range', 'Kurtosis',
                                                         'Skewness'] ).T

当我编写输出数据帧的上述python函数并尝试在上述函数中向数据帧添加一列时:

featureTime['Whether Staying Late'] = featureTime['Number of Late Night Activities'].apply( lambda x: x > 0 ).apply(lambda x: sum(x))

我遇到了一个错误:

TypeError                                 Traceback (most recent call last)
/home/aaa/Enthought/Canopy_64bit/System/lib/python2.7/site- packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
181             else:
182                 filename = fname
--> 183             __builtin__.execfile(filename, *where)

/home/aaa/pyRepo/feature_selection_v15.py in <module>()
352 featureTime.to_csv('time.csv')
353 
--> 354 featureTime['Whether Staying Late'] = featureTime['Number of Late Night    Activities'].apply( lambda x: x > 0 ).apply(lambda x: sum(x))
355 
356 

/home/aaa/Enthought/Canopy_64bit/User/lib/python2.7/site- packages/pandas/core/series.pyc in apply(self, func, convert_dtype, args, **kwds)
2445             values = lib.map_infer(values, lib.Timestamp)
2446 
-> 2447         mapped = lib.map_infer(values, f, convert=convert_dtype)
2448         if isinstance(mapped[0], Series):
2449             from pandas.core.frame import DataFrame

/home/aaa/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/lib.so in pandas.lib.map_infer (pandas/lib.c:41822)()

/home/aaa/pyRepo/feature_selection_v15.py in <lambda>(x)
352 featureTime.to_csv('time.csv')
353 
--> 354 featureTime['Whether Staying Late'] = featureTime['Number of Late Night  Activities'].apply( lambda x: x > 0 ).apply(lambda x: sum(x))
355 
356 

TypeError: 'numpy.bool_' object is not iterable

如果我通过与控制台交谈手动添加它,则它不存在。

我已经通过使用 python 内置数据类型和 for 循环解决了这个问题。让我好奇的是为什么我会得到上面那种错误......想知道它来自哪里......

【问题讨论】:

  • 你能发布完整的堆栈跟踪吗?

标签: python numpy boolean pandas iterable


【解决方案1】:

假设 sequence.apply 将 lambda 应用于序列中的每个元素,sequence.apply(lambda x: x &gt; 0) 会产生一系列布尔值,sequence.apply(lambda x: x &gt; 0).apply(lambda x: sum(x)) 会尝试对每个布尔值求和,从而导致 'bool' object is not iterable-kinda 错误。您会收到类似的错误:

>>> sum(True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'bool' object is not iterable

【讨论】:

  • 嗯,很奇怪,sum(True) 实际上对我有用(不是 sum([True]),但两者都适用于我的电脑)。更困扰 sme 的是,使用完全相同的代码,在一种情况下,我将它放入 .py 文件中,但它不起作用;在另一个中,我将它输入到控制台中,它运行良好......也许是我的 python/linux 版本。
  • 我使用了另一个 IDE,sum(True) 现在返回错误。我认为树冠为我做了“修正”。也许其他奇怪的东西也来自这个 IDE...非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2017-06-22
  • 2014-10-09
  • 2017-06-29
  • 2017-03-22
  • 2020-03-08
  • 2013-06-03
  • 2020-04-18
  • 2018-06-25
相关资源
最近更新 更多