Я пытаюсь вернуть URL-адреса для списка названий компаний, а затем обновить фрейм данных pandas, чтобы включить возвращенные URL-адреса.
Я импортирую все зависимости и читаю файл .csv:
import logging
import os
import pandas as pd
import re
from googlesearch import search
df = pd.read_csv('Building_Contractors_Stephen_V1.csv')
df.head()
Затем я определяю функцию, которая получает все URL-адреса:
def get_urls(tag, n, language):
urls = [url for url in search(tag, stop=n, lang=language)][:n]
return urls
Затем я тестирую это на одном URL-адресе:
test_return = get_urls(df.Hospital_Building_Contractors[0], 10, 'en')
test_return
Который возвращает список URL-адресов:
['https://www.turnerconstruction.com/',
'http://www.turnerconstruction.com/careers',
'http://www.turnerconstruction.com/office-network',
'http://www.turnerconstruction.com/about-us',
'http://www.turnerconstruction.com/turner-university',
'http://www.turnerconstruction.com/careers/jobs',
'http://www.turnerconstruction.com/about-us/where-we-work',
'https://en.wikipedia.org/wiki/Turner_Construction',
'https://en.wikipedia.org/wiki/Turner_Construction#History',
'https://en.wikipedia.org/wiki/Turner_Construction#Early_years']
Чего я не могу понять, так это того, как перебирать все элементы в моих списках и добавлять их в новые столбцы в фрейме данных.
Вот мой код для этого:
i = 0
num = len(df.Hospital_Building_Contractors)
while i < num:
get_urls(df.Hospital_Building_Contractors[i], 1, 'en')
df.insert(1, "URL", urls, allow_duplicates=True)
i += 1
Который возвращает эту ошибку:
NameError Traceback (most recent call last) in 17 while i < num: 18 get_urls(df.Hospital_Building_Contractors[i], 1, 'en') ---> 19 df.insert(1, "URL", urls, allow_duplicates=True) 20 i += 1 21
NameError: name 'urls' is not defined
Я уверен, что эту проблему легко обойти, но я в тупике. Я определяю «urls» в функции get_urls(); поэтому я не уверен, почему я получаю эту ошибку.
В идеале у меня было бы решение, которое выглядит примерно так:
a = 0
num = len(df.Hospital_Building_Contractors)
while a < num:
get_urls(df.Hospital_Building_Contractors[a], 1, 'en')
df.insert(1, "URL", urls, allow_duplicates=True)
a += 1
b = 0
num = len(df.University_Building_Contractors)
while b < num:
get_urls(df.University_Building_Contractors[b], 1, 'en')
df.insert(3, "URL", urls, allow_duplicates=True)
b += 1
c = 0
num = len(df.Hospital_Building_Contractors)
while c < num:
get_urls(df.Hospital_Building_Contractors[c], 1, 'en')
df.insert(5, "URL", urls, allow_duplicates=True)
c += 1
Который будет перебирать каждый список, находить URL-адреса и добавлять их в фрейм данных.
Более вероятно, что проблема в моем коде, но я подробно описал проблему в комментарии к вашему ответу ниже. Ты знаешь, как это исправить, @jezrael?






Используйте пользовательский lambda function с фильтром для работы только со строками:
from googlesearch import search
df = pd.read_csv('Building_Contractors_Stephen_V1.csv')
#print (df)
def get_urls(tag, n, language):
urls = [url for url in search(tag, stop=n, lang=language)][:n]
return urls
#for only one top1 value
f = lambda x: next(iter(get_urls(x, 1, 'en') if isinstance(x, str) else []), 'no value')
#for multiple top values, eg. top3
#f = lambda x: get_urls(x, 3, 'en') if isinstance(x, str) else []
df['a'] = df.Hospital_Building_Contractors.apply(f)
df['b'] = df.University_Building_Contractors.apply(f)
df['c'] = df.Military_Contractors.apply(f)
print (df.tail())
Hospital_Building_Contractors University_Building_Contractors \
104 Progressive AE NaN
105 Hellas Construction NaN
106 Wight & Company NaN
107 PWI Engineering NaN
108 Cordogan Clark & Associates NaN
Military_Contractors a \
104 NaN https://www.linkedin.com/company/progressive-ae
105 NaN http://www.hellasconstruction.com/
106 NaN https://www.wightco.com/
107 NaN http://www.pwius.com/
108 NaN http://www.cordoganclark.com/
b c
104 no value no value
105 no value no value
106 no value no value
107 no value no value
108 no value no value
Добавление новых столбцов в фреймворк данных можно сделать ниже.
df["new column name"] = urls #list
Надеюсь это поможет.
Нет, потому что список URL-адресов предназначен для одного значения df.Hospital_Building_Contractors
Какая-то проблема с решением?