1
votes

Enregistrement de plusieurs trames de données à partir d'une boucle

J'ai cherché une solution à mon problème, mais toutes les réponses que je trouve utilisent print () à la fin de la réponse, et NE PAS enregistrer les blocs de données comme je le voudrais.

Ci-dessous, j'ai un ( presque) code fonctionnel qui imprime 3 tables séparées. Comment puis-je enregistrer ces trois tables dans 3 blocs de données séparés avec les noms matches_octobre, matches_november et matches_december?

La dernière ligne de mon code ne fonctionne pas comme je le souhaite. J'espère que ce que j'aimerais que le code fasse soit clair (Enregistrer une trame de données à la fin de chacun des 3 tours de la boucle)

import pandas as pd
import requests
from bs4 import BeautifulSoup

base_url  = 'https://www.basketball-reference.com/leagues/NBA_2019_games-'
valid_pages = ['october','november','december']
end = '.html'
for i in valid_pages:
    url = '{}{}{}'.format(base_url, i, end)
    res = requests.get(url)
    soup = BeautifulSoup(res.content,'lxml')
    table = soup.find_all('table')[0] 
    df = pd.read_html(str(table))
    print(df)
    matches + valid_pages = df[0]


7 commentaires

Quelle est la variable correspond dans votre code?


Vous n'avez pas défini de correspondances, cela ne fonctionnera donc pas. Ajoutez matches = '' au début


C'est peut-être ce que je ne comprends pas. "matches + valid_pages" est le nom des nouvelles trames de données. correspond est défini dans la dernière ligne.


@ Dennis.M Cela ne fonctionnera pas.


@Jonas En général, cela se fait avec un dictionnaire. Seriez-vous contre cela? L'accès ressemblerait à quelque chose comme dict_of_dfs ['matches_october']


@brentertainer - Je ne serais pas opposé aux dictionnaires. Je ne sais tout simplement pas comment le mettre en œuvre?


Je suis d'accord avec @ brentertainer: c'est un cas pour les dictionnaires. Si vous insistez pour utiliser des variables séparées, vous pouvez utiliser exec (matches + valid_pages + '= df [0]') , mais cela serait mal vu par la communauté python :)


3 Réponses :


2
votes

Vous pouvez le caser, mais ce n'est pas très robuste (et c'est plutôt moche).

matches[i] = pd.read_html(str(table))

Une solution plus élégante est d'utiliser un dictionnaire. Avant la boucle, déclarez matches = {} . Ensuite, à chaque itération:

if i == 'october':
    matches_october = pd.read_html(str(table))
if i == 'november':
    # so on and so forth

Ensuite, vous pouvez accéder au DataFrame des matchs d'octobre via matches ['octobre'] .

p>


0 commentaires

1
votes

Vous ne pouvez pas composer les noms de variables en utilisant + , essayez plutôt d'utiliser un dict :

import pandas as pd
import requests
from bs4 import BeautifulSoup

matches = {} # create an empty dict

base_url  = 'https://www.basketball-reference.com/leagues/NBA_2019_games-'
valid_pages = ['october','november','december']
end = '.html'
for i in valid_pages:
    url = '{}{}{}'.format(base_url, i, end)
    res = requests.get(url)
    soup = BeautifulSoup(res.content,'lxml')
    table = soup.find_all('table')[0] 
    df = pd.read_html(str(table))
    print(df)
    matches[i] = df[0]  # store it in the dict


0 commentaires

0
votes

Merci les gars. Ça a marché! :)

import pandas as pd
import requests
from bs4 import BeautifulSoup

matches = {} # create an empty dict

base_url  = 'https://www.basketball-reference.com/leagues/NBA_2019_games-'
valid_pages = ['october','november','december']
end = '.html'
for i in valid_pages:
    url = '{}{}{}'.format(base_url, i, end)
    res = requests.get(url)
    soup = BeautifulSoup(res.content,'lxml')
    table = soup.find_all('table')[0] 
    df = pd.read_html(str(table))
    matches[i] = df[0]  # store it in the dict

matches_october = matches['october']


0 commentaires