Добавление очищенного списка в Pandas Dataframe

Я пытаюсь вернуть 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()

результаты 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 13.02.2019 10:06

Более вероятно, что проблема в моем коде, но я подробно описал проблему в комментарии к вашему ответу ниже. Ты знаешь, как это исправить, @jezrael?

Haytorade 13.02.2019 10:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
168
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте пользовательский 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

jezrael 13.02.2019 07:09

Другие вопросы по теме