我需要创建两个具有布尔值或是/否值的新列,以测试链接是否包含某个单词。从我的csv文件中,数据集的示例可以如下所示:
Col1
0 Dom.ie
1 Bho.int
2 Manchester.co.uk
... ...
[1800 rows x 12 columns]
如果Col1中的值包含或不包含某个单词,我想创建这两个新列Check_1
和Check_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_'))