我试着去了解在我的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']][:]
该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]
所述NaN
在DIAGNOS
列是问题的根源,因为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