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
corresponddans 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 :)