Как вывести pandas фрейм данных из пользовательской функции? - PullRequest
1 голос
/ 15 апреля 2020

Я очищаю четыре разные страницы от Craiglist, которые имеют точно такую ​​же структуру. Чтобы ускорить это, я написал функцию, которая делает это, которая должна производить pandas df в результате. Я знаю, что эта функция работает, потому что я включил в нее операторы print, которые дают ожидаемый результат. Тем не менее, когда я пытаюсь использовать набор данных, который, как предполагается, функция dunction выводит позже в коде, я получаю сообщение об ошибке:

NameError: name 'out_df' is not defined

Вот код моей функции:

#create function to grab the posts
def grab_posts(response, end_value):   
    html_soup = BeautifulSoup(response.text, 'html.parser')
    posts = html_soup.find_all('li', class_ = 'result-row')
#     return posts_i
    print(type(posts))
    print(len(posts))
    #get item description, item price, and listing dates for each item
    items = []
    prices = []
    dates = []
    for i in range(end_value):
        items.append(posts[i].find(class_ = 'result-title hdrlnk').text)
        prices.append(posts[i].find(class_ = 'result-price').text)
        dates.append(posts[i].find(class_ = 'result-date').text)
    print(len(items))
    #create Series from items
    items_col = pd.Series(items)
    #create Series from prices
    prices_col = pd.Series(prices)
    #create Series from dates
    dates_col = pd.Series(dates)
    print(type(dates_col))
    #concatenate
    out_df = pd.concat([items_col, prices_col, dates_col], axis = 1)
    print(out_df.head())
    out_df.rename(columns = {
                0: 'item_description',
                1: 'price',
                2: 'date_listed'
            }, inplace = True)
    print(out_df.head())
    print(type(out_df))
    return out_df

Кажется, что функция работает, потому что операторы print производят то, что я ожидаю (вплоть до печати фрейма данных). См. Изображение ниже.

Output of the function

Однако простая команда, такая как

type(out_df)

, выдает ошибку, о которой я упоминал выше. Может кто-нибудь пролить свет на то, почему это происходит, и как я могу получить данные, полученные в функции, в память моего ноутбука Jupyter?

1 Ответ

0 голосов
/ 15 апреля 2020

Если вы вызываете его вне функции:
Вы должны назначить возврат функции переменной. Например:

out_df = grab_posts(response, end_value)
type(out_df)

Если внутри функции:
Попробуйте объявить ее глобальной,

#create function to grab the posts
def grab_posts(response, end_value):   
    html_soup = BeautifulSoup(response.text, 'html.parser')
    posts = html_soup.find_all('li', class_ = 'result-row')
#     return posts_i
    print(type(posts))
    print(len(posts))
    #get item description, item price, and listing dates for each item
    items = []
    prices = []
    dates = []
    for i in range(end_value):
        items.append(posts[i].find(class_ = 'result-title hdrlnk').text)
        prices.append(posts[i].find(class_ = 'result-price').text)
        dates.append(posts[i].find(class_ = 'result-date').text)
    print(len(items))
    #create Series from items
    items_col = pd.Series(items)
    #create Series from prices
    prices_col = pd.Series(prices)
    #create Series from dates
    dates_col = pd.Series(dates)
    print(type(dates_col))
    #concatenate
    global out_df
    out_df = pd.concat([items_col, prices_col, dates_col], axis = 1)
    print(out_df.head())
    out_df.rename(columns = {
                0: 'item_description',
                1: 'price',
                2: 'date_listed'
            }, inplace = True)
    print(out_df.head())
    print(type(out_df))
    return out_df
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...