映射(lambda)函数到字符串列表失败“浮动”对象不迭代(mapping a (lambda) f

2019-10-31 03:29发布

我试着去了解在我的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第一,并建立从适配器数据帧,见下图。 我不知道为什么会更改相关数据类型,据我可以验证熊猫系列具有字符串列表在这两种情况下...这是使用Python 2.7.6和熊猫0.13.1。

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

Answer 1:

TypeError: 'float' object is not iterable可能,如果数据丢失的值发生DIAGNOS 。 例如,当数据是这样的:

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]

所述NaNDIAGNOS列是问题的根源,因为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被传递到tobacco时功能diganose.map(tobacco)被调用。 由于NaN是一个浮子和不迭代,则for x in lst循环提高了TypeError


为了避免这种错误,更换的NaN在treatments['DIAGNOS']

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]


文章来源: mapping a (lambda) function to lists of strings fails 'float' object not iterable