正在创建新列并检查字符串值,但得到了TypeError



我需要创建两个具有布尔值或是/否值的新列,以测试链接是否包含某个单词。从我的csv文件中,数据集的示例可以如下所示:

Col1                    
0                        Dom.ie    
1                       Bho.int       
2              Manchester.co.uk      
...                         ...      

[1800 rows x 12 columns]

如果Col1中的值包含或不包含某个单词,我想创建这两个新列Check_1Check_2;例如:

list_1= ['dom', 'ans', 'warm']
list_2= ['dom', 'dog', 'manchester']
Col1                     Check_1      Check_2                     
0                        dom.ie        Yes             Yes
1                       bho.int        No               No
2              manchester.co.uk        No              Yes
...                         ...        ...

[1800 rows x 14 columns]

我尝试过:

import pandas as pd
import numpy as np  
def part_is_in(x, values):
output = 'No'
for val in values:
if val in x:
return 'Yes'
break                
return output
df['Check_1'] = df['Col1'].apply(part_is_in, values = list_1)
df['Check_2'] = df['Col1'].apply(part_is_in, values = list_2)

然而,我得到了以下错误:

TypeError:类型为"float"的参数不可迭代

与:df['Check_1'] = df['Col1'].apply(part_is_in, values = list_1)if val in x相关。你能告诉我这是什么意思吗?我该怎么修?谢谢

这些解决方案没有找到错误的根源。您没有发布所有数据,但我猜测Col1中可能有一些浮点值,这会在调用if val in x时导致错误。具有Object dtype的列中可以有混合类型(请参阅https://pbpython.com/pandas_dtypes.html)。

测试这一点的一个简单方法是将其更改为if val in str(x),或者,根据您的panda版本,您可以使用to_string将整个列转换为字符串。

以下是我使用str.contains:的方法

s = df['Col1'].str.lower()
all_lsts = [list_1, list_2]
for i,lst in enumerate(all_lsts, start=1):
df[f'Check_{i}'] = s.str.contains('|'.join(lst))

输出:

Col1  Check_1  Check_2
0            Dom.ie     True     True
1           Bho.int    False    False
2  Manchester.co.uk    False     True

IIUC

import re
s=pd.concat([df.Col1.str.contains('|'.join(x),flags=re.IGNORECASE) for x in [list_1,list_2]],1)
Out[19]: 
Col1   Col1
0   True   True
1  False  False
2  False   True
df=df.join(s.add_prefix('check_'))

最新更新