Aggiungi righe al frame di dati panda alla fine di un ciclo

Aug 24 2020

Sto cercando di aggiungere righe nel frame di dati come parte di un ciclo.

Il programma scorre gli URL ed estrae i dati in un formato frame di dati

for id in game_ids:
    df_team_final = []
    df_player_final = []
    url = 'https://www.fibalivestats.com/data/' + id + '/data.json'
    content = requests.get(url)
    data = json.loads(content.content)

Alla fine del loop ho usato concat per unire i due df delle squadre in trasferta (e dei giocatori)

    team_full = pd.concat([df_home_team, df_away_team])
    player_full = pd.concat([df_home_player_merge, df_away_player_merge])

Fuori dal ciclo ho quindi programmato di salvare come Excel

# #if cant find it, create new spread sheet
writer = pd.ExcelWriter('Box Data.xlsx', engine='openpyxl')
team_full.to_excel(writer, sheet_name='Team Stats', index=False)
player_full.to_excel(writer, sheet_name='Player Stats', index=False)
writer.save()
writer.close()

Dato che sto scorrendo un certo numero di pagine web ho bisogno di aggiornare il df mentre vado, ovviamente nel formato corrente sto solo sovrascrivendo il primo URL con il secondo ciclo

Qual è il modo migliore per aggiungere o aggiungere al dataframe alla fine del ciclo?

Grazie

Risposte

1 politicalscientist Aug 24 2020 at 05:04

Posso fornire qui solo uno schema semplice poiché non vediamo il codice completo.

Presumo che tu non aggiunga dati raschiati a una sorta di contenitore, quindi si perde dopo l'iterazione successiva.

# empty lists outside of loop to store data
df_team_final = []
df_player_final = []

for id in game_ids:
    url = 'https://www.fibalivestats.com/data/' + id + '/data.json'
    content = requests.get(url)
    data = json.loads(content.content)

    # create dataframes that you need
    # df_home_team, df_away_team etc
    # and append data to containers

    team_full = pd.concat([df_home_team, df_away_team])
    player_full = pd.concat([df_home_player_merge, df_away_player_merge])

    df_team_final.append(team_full)
    df_player_final.append(player_full )

Ora che hai memorizzato i dataframe come elenchi, puoi unirli con pandas.concat

# outside of the loop
team_full = pd.concat(df_team_final)
player_full = pd.concat(df_player_final)

e salva subito:

writer = pd.ExcelWriter('Box Data.xlsx', engine='openpyxl')
team_full.to_excel(writer, sheet_name='Team Stats', index=False)
player_full.to_excel(writer, sheet_name='Player Stats', index=False)
writer.save()
writer.close()

modificare

Dal file che hai condiviso vedo che hai aggiunto dei contenitori all'interno di un loop:

Ma dovresti metterli prima che inizi il ciclo:

# initialize them here
df_team_final = []
df_player_final = []
for id in game_ids: