Создание новых столбцов и проверка строковых значений, но получил TypeError - PullRequest
1 голос
/ 10 апреля 2020

Мне нужно создать два новых столбца с логическими значениями или значениями Да / Нет, чтобы проверить, содержит ли ссылка определенное слово или нет. Из моего CSV-файла образец набора данных может выглядеть следующим образом:

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


[1800 rows x 12 columns]

Я хотел бы создать эти два новых столбца, Check_1 и Check_2, если значения в Col1 содержат или нет определенное слово; Например:

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. Не могли бы вы сказать мне, что это значит и как я могу это исправить? Спасибо

Ответы [ 3 ]

1 голос
/ 10 апреля 2020

IIU C

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_'))
1 голос
/ 10 апреля 2020

Эти решения не доходят до root ошибки. Вы не опубликовали все данные, но я предполагаю, что в Col1 могут быть некоторые числа с плавающей точкой, что вызывает ошибку при вызове if val in x. Столбец с типом объекта d может иметь смешанные типы (хороший обзор этой проблемы: https://pbpython.com/pandas_dtypes.html).

Простой способ проверить это - изменить его на if val in str(x) или в зависимости от вашей версии pandas вы можете преобразовать весь столбец в строку, используя to_string.

1 голос
/ 10 апреля 2020

Вот мой подход с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...