Почему использование str (df[col]) приводит к тому, что код относится только к одной записи?

#python #pandas #web-scraping #beautifulsoup #data-science

#python #pandas #очистка веб-страниц #beautifulsoup #наука о данных

Вопрос:

У меня есть фрейм данных, содержащий лиды (имена). Я пытаюсь найти в Интернете соответствующие данные, касающиеся этих потенциальных клиентов.

Я использую beautifulsoup и urllib для очистки данных. URL-адрес выглядит следующим образом :

 url = u'https://www.website.com/SearchResults?query='   quote(str(df['name']))
  

Проблема в том, что для каждого вывода я получаю одни и те же данные, которые являются данными для последнего вывода в dataframe, из которого были извлечены данные.

всякий раз, когда я использую строковое имя вместо str(df[‘name’]), я получаю для конкретного вывода правильные данные, и это выглядит так :

 url = u'https://www.website.com/SearchResults?query='   quote('this is a leads name')
  

Причина, по которой я думаю, что проблема конкретно связана с str(df[‘name’]), заключается в том, что всякий раз, когда я его удаляю, я успешно получаю данные, в противном случае я получаю для 100 000 лидов одни и те же данные. Единственная проблема в том, что для использования выводов из фрейма данных мне нужно использовать str.

Комментарии:

1. Что делает ваш quote метод?

2. df['name'].astype(str) ? или df['name'].apply(lambda x: str(x)) для операций по строке? Я не верю, что когда-либо использовал str(df[col]) , поэтому я не уверен, что произойдет. Надеюсь, это поможет.

Ответ №1:

str(df) вернет текстовое представление фрейма данных. Например

 >>> pd.DataFrame({"col1":[1,2,3,4], "name":["row1","row2","row3","row4"]})
    col1  name
0     1  row1
1     2  row2
2     3  row3
3     4  row4
  

текстовое представление для вышеуказанного фрейма данных вернет

 col1  name
1  row1
2  row2
3  row3
4  row4
  

Итак, для выполнения операций по строке лучше всего использовать apply функцию из dataframe.

 >>> def search_url(search_lead):
...     url = u'https://www.website.com/SearchResults?query='   search_lead
...     print(url) #You can do your operation here
  

Используя приведенную выше функцию, используйте apply

 >>> df.name.apply(lambda x: search_url(x))
https://www.website.com/SearchResults?query=row1
https://www.website.com/SearchResults?query=row2
https://www.website.com/SearchResults?query=row3
https://www.website.com/SearchResults?query=row4
0    None
1    None
2    None
3    None
Name: name, dtype: object
  

Вы можете выполнять очистку веб-страниц внутри функции. Надеюсь, этот ответ поможет вам.

Ответ №2:

Спасибо всем.

Я попробовал то, что вы, ребята, предложили. Что действительно сработало для меня, так это создание функции, которая будет получать данные из Интернета, а затем использовать цикл for для вызова функции для каждого имени пользователя в строке.

В двух словах это то, что я сделал :

Функция:

 def getdata(name):

    url = u'https://www.website.com/search?q='   quote(str(name))
    .
    .
    .
    return (data)
  

Цикл :

 for i, row in df.iterrows():

    leaddata = getdata(df.name[i])

    list1.append(leaddata)
  

Затем я приступил к вставке списка в фрейм данных.