'Instancing objects with loop and get one dataframe from it

I have defined a class "Scraper" and the method "scraping" contained in it outputs a list with price information ("results"). My objects are several online shops, for which I have defined the respective attributes. Currently I only manage to get a separate DataFrame with the price information for each online shop with separate queries (see code snippet).

def main():
    online_shop_1 = Scraper('Attr_1', 'Attr_2', …)
    online_shop_2 = Scraper('Attr_1', 'Attr_2', …)
    online_shop_1.scraping()
    df_results_ = pd.DataFrame(results)
    print(df_results)
    online_shop_2.scraping()
    df_results = pd.DataFrame(results)
    print(df_results)

I would like to iterate with a loop over all online shops and get directly one DataFrame containing the price information of all online shops. I guess the question, has already been asked and answered in a similar form, however, as a beginner, I do not yet manage to apply the solutions to my problem. Therefore I would be very pleased about support.



Solution 1:[1]

The following code did the trick:

            global df_results 
            df_results = pd.DataFrame(results)

def main():
    online_shop_1 = Scraper('Attr_1', 'Attr_2', …)
    online_shop_2 = Scraper('Attr_1', 'Attr_2', …)
    complete_results = []
    shops = [online_shop_1, online_shop_2]
        for shop in shops:
        shop.scraping()
        complete_results.append(df_results)
    complete_results = pd.concat(complete_results, ignore_index=True)

Solution 2:[2]

I don't fully understand your code, for example is the results variable the output of the .scraping() method, if so, is it getting assigned globally?

But maybe you can try a simple for-loop in which you call the scraping method and add the results to a previously created dataframe.

def main():
    online_shop_1 = Scraper('Attr_1', 'Attr_2', …)
    online_shop_2 = Scraper('Attr_1', 'Attr_2', …)

    df = pd.DataFrame()
    shops = {'shop1': online_shop_1, 'shop2':online_shop_2}
    for shop_name,shop in shops.items():
        shop.scraping()
        df[shop_name] = results
        

This should give you one dataframe with a column for each shop.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Christian K.
Solution 2 Sean