ループの最後にパンダのデータフレームに行を追加します

Aug 24 2020

ループの一部としてデータフレームに行を追加しようとしています。

プログラムはURLをループし、データフレーム形式でデータを抽出します

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)

ループの最後に、concatを使用して、アウェイ/ホームチーム(およびプレーヤー)の2つのdfをマージしました。

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

ループの外側で、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()

いくつかのWebページをループしているので、移動しながらdfを更新する必要があります。明らかに現在の形式では、最初のURLを2番目のループで上書きしています。

ループの最後にデータフレームに追加または追加する最良の方法は何ですか?

ありがとうございました

回答

1 politicalscientist Aug 24 2020 at 05:04

完全なコードが表示されないため、ここでは簡単な概要のみを示します。

ある種のコンテナにスクレイピングされたデータを追加しないと仮定しているので、次の反復後に失われます。

# 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 )

データフレームをリストとして保存したので、それらをマージできます pandas.concat

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

一度に保存:

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()

編集

共有したファイルから、ループ内にコンテナーを追加したことがわかります。

ただし、ループが始まる前にそれらを配置する必要があります。

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