带有.tolist()的pandas str.split产生了一个浮动?

时间:2015-07-29 19:04:22

标签: python string list pandas split

我很难修复我的代码,它在测试整个数据的一小部分时运行良好。我可以仔细检查类型,但错误信息已足够提供信息:我制作的列表最终成为一个浮点数。但是如何?

最后三行:

diagnoses = all_treatments['DIAGNOS'].str.split(' ').tolist()
all_treatments = all_treatments.drop(['DIAGNOS','INDATUMA','date'], axis=1)
all_treatments['tobacco'] = tobacco(diagnoses)

错误:

Traceback (most recent call last):
 File "treatments2_noiopro.py", line 97, in <module>
   all_treatments['tobacco'] = tobacco(diagnoses)
 File "treatments2_noiopro.py", line 13, in tobacco
   for codes in codes_column]
TypeError: 'float' object is not iterable

FWIW,功能本身是:

def tobacco(codes_column):
    return [any('C30' <= code < 'C40' or 
                'F17' <= code <'F18'
                for code in codes) if codes else False
            for codes in codes_column]

我在Linux下使用版本pandas 0.16.2 np19py26_0,iopro 1.7.1 np19py27_p0和python 2.7.10 0。

2 个答案:

答案 0 :(得分:1)

您可以在系列中使用str.split并将函数应用于结果:

def tobacco(codes):
    return any(['C30' <= code < 'C40' or 'F17' <= code <'F18' for code in codes])

data = [('C35 C50'), ('C36'), ('C37'), ('C50 C51'), ('F1 F2'), ('F17'), ('F3 F17'), ('')]
df = pd.DataFrame(data=data, columns=['DIAGNOS'])
df

    DIAGNOS
0   C35 C50
1   C36
2   C37
3   C50 C51
4   F1 F2
5   F17
6   F3 F17
7   
df.DIAGNOS.str.split(' ').apply(tobacco)

0     True
1     True
2     True
3    False
4    False
5     True
6     True
7    False
dtype: bool

编辑:

似乎使用str.contains比两种方法都快得多。

tobacco_codes = '|'.join(["C{}".format(i) for i in range(30, 40)] + ["F17"])

data = [('C35 C50'), ('C36'), ('C37'), ('C50 C51'), ('F1 F2'), ('F17'), ('F3 F17'), ('C3')]
df = pd.DataFrame(data=data, columns=['DIAGNOS'])

df.DIAGNOS.str.contains(tobacco_codes)

答案 1 :(得分:-1)

我猜诊断是一个生成器,因为你在代码的第2行丢弃某些内容,这会改变生成器。我现在无法测试任何内容,但在评论代码的第2行时,请告诉我它是否有效。