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]
3 Réponses :
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>
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
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']
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ébutC'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 :)