【问题标题】:mapping a (lambda) function to lists of strings fails 'float' object not iterable将(lambda)函数映射到字符串列表失败'float'对象不可迭代
【发布时间】:2014-07-14 11:56:03
【问题描述】:

我试图了解我的 Python 脚本哪里出错了。我有一个熊猫系列(diagnoses)列表,每个列表都是字符串列表(从不为空)。我可以并且确实使用diagnoses.map(type)

验证了这一点
for x in diagnoses[0]:
    type x

然而,当我将 lambda 函数映射到这一系列列表时,我得到一个 TypeError: 'float' object not iterable

想象一下这样的数据:

LopNr   AR  var3    va4 var5    var6    var7    var8    var9    var10   DIAGNOS
6   2011                                    S834
6   2011                                    K21 S834

代码是:

from pandas import *
tobacco = lambda lst: any( (((x >= 'C30') and (x<'C40')) or ((x >= 'F17') and (x<'F18')))  for x in lst)
treatments = read_table(filename,usecols=[0,1,10])
diagnoses = treatments['DIAGNOS'].str.split(' ')
treatments['tobacco'] = diagnoses.map(tobacco)

发生了什么,我该如何解决?

PS:如果我首先使用IOpro 导入源文本文件并从该适配器构建一个数据框,那么相同的代码肯定会在非常相似的系列上运行,见下文。我不确定为什么这会改变相关的数据类型,据我所知,pandas Series 在任何一种情况下都有字符串列表……这是 Python 2.7.6 和 pandas 0.13.1。

import iopro
adapter = iopro.text_adapter(filename,parser='csv',field_names=True,output='dataframe',delimiter='\t')
treatments = adapter[['LopNr','AR','DIAGNOS']][:]

【问题讨论】:

    标签: python list types lambda pandas


    【解决方案1】:

    如果数据缺少DIAGNOS 的值,则可能会出现TypeError: 'float' object is not iterable。例如,当数据如下所示:

    LopNr   AR  var3    va4 var5    var6    var7    var8    var9    var10   DIAGNOS
    6   2011    a   a   a   a   a   a   a   a   S834
    6   2011    a   a   a   a   a   a   a   a   
    6   2011    a   a   a   a   a   a   a   a   K21 S834
    

    然后

        In [68]: treatments = pd.read_table('data', usecols=[0,1,10])
    
    In [69]: treatments
    Out[69]: 
           LopNr    AR   DIAGNOS
    0          6  2011      S834
    1          6  2011       NaN
    2          6  2011  K21 S834
    
    [3 rows x 3 columns]
    

    DIAGNOS 列中的 NaN 是问题的根源,因为 str.split(' ') 保留了 NaN:

    In [70]: diagnoses = treatments['DIAGNOS'].str.split(' ')
    
    In [71]: diagnoses
    Out[72]: 
    0         [S834]
    1            NaN
    2    [K21, S834]
    Name: DIAGNOS, dtype: object
    

    NaN 在调用diganose.map(tobacco) 时被传递给tobacco 函数。由于NaN 是浮点数且不可迭代,因此for x in lst 循环引发TypeError


    为避免此错误,请替换 treatments['DIAGNOS'] 中的 NaN:

    import pandas as pd
    
    def tobacco(lst):
        return any((('C30' <= x < 'C40') or ('F17' <= x <'F18')) for x in lst)
    
    treatments = pd.read_table('data', usecols=[0,1,10])
    treatments['DIAGNOS'].fillna('', inplace=True)
    diagnoses = treatments['DIAGNOS'].str.split(' ')
    treatments['tobacco'] = diagnoses.map(tobacco)
    print(treatments)
    

    产量

           LopNr    AR   DIAGNOS tobacco
    0          6  2011      S834   False
    1          6  2011             False
    2          6  2011  K21 S834   False
    
    [3 rows x 4 columns]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-27
      • 2018-08-06
      • 2015-10-23
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      相关资源
      最近更新 更多