首页 > 解决方案 > 在 for 循环中将数据帧附加在一起

问题描述

我觉得这应该很简单,但我对 Python 还是有点陌生​​,正在努力弄清楚我应该做什么。我正在抓取历史股票数据,并希望将它们放入一个 Excel 电子表格中。它目前只写出最后的库存数据。

我知道它本质上是在每次通过循环时写入数据帧,但我不确定如何修复它以附加数据帧,或者每次到达该位置时写入 Excel 表的末尾。任何帮助,将不胜感激。

这是我的代码:

import numpy as np
from bs4 import BeautifulSoup
import requests
import pandas as pd
import time

symbols = ['WYNN', 'FL', 'TTWO']
myColumnHeaders = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']

for c in range(len(symbols)):
    url = 'https://www.nasdaq.com/symbol/'+symbols[c]+'/historical'
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'html.parser')
    historicaldata = soup.find('div', {'id': 'quotes_content_left_pnlAJAX'})
    data_rows = historicaldata.findAll('tr')[2:]
    stock_data = [[td.getText().strip() for td in data_rows[a].findAll('td')]
                 for a in range(len(data_rows))]
    df = pd.DataFrame(stock_data, columns=myColumnHeaders)
    df.set_index('Date')

    df['Volume'].str.replace(',','').astype(int)
    for i in range(5):
        if i == 0:
            df[myColumnHeaders[i]] = pd.to_datetime(df[myColumnHeaders[i]], 'coerce')
        else:
            df[myColumnHeaders[i]] = pd.to_numeric(df[myColumnHeaders[i]], errors='coerce')

df.to_excel('stock data.xlsx',index=False) 

标签: pythonpandasloopsdataframeappend

解决方案


不要pd.DataFrame.append循环使用

这是低效的,因为它涉及重复复制数据。一个更好的主意是创建一个数据帧列表,然后在循环外的最后一步将它们连接起来。这是一些伪代码:

symbols = ['WYNN', 'FL', 'TTWO']
cols = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']

dfs = []  # empty list which will hold your dataframes

for c in range(len(symbols)):
    # some code

    df = pd.DataFrame(stock_data, columns=cols)
    df = df.set_index('Date')

    df['Volume'] = df['Volume'].str.replace(',', '').astype(int)

    df[cols[0]] = pd.to_datetime(df[cols[0]], errors='coerce')
    df[cols[1:5]] = df[cols[1:5]].apply(pd.to_datetime, errors='coerce')

    dfs.append(df)  # append dataframe to list

res = pd.concat(dfs, ignore_index=True)  # concatenate list of dataframes
res.to_excel('stock data.xlsx', index=False)

请注意,您正在执行许多操作,例如set_index,就好像它们默认就位一样。事实并非如此。您应该分配回一个变量,例如df = df.set_index('Date').


推荐阅读