逐行向Pandas数据框添加数据

3

我正在制作一个数据框架,并需要逐行添加内容。我使用以下代码创建了该数据框架:

df = pd.DataFrame(columns=('date', 'daily_high', 'daily_low'))

然后我会从API中读取数据,所以我运行:
for api in api_list:
    with urllib.request.urlopen(api) as url:
        data = json.loads(url.read().decode())

我需要将 data 中的不同属性放入数据框中。
我尝试过使用
df = df.append({'date':datetime.fromtimestamp(data["currently"]["time"]).strftime("20%y%m%d"), 'daily_high' : data["daily"]["data"][0]["temperatureHigh"], 'daily_low': data["daily"]["data"][0]["temperatureLow"]},ignore_index=True)

在 for 循环中,但是这需要很长时间,我不确定这是否是一种好的做法。有更好的方法吗?也许我可以创建三个单独的序列,然后将它们连接起来?


你只需将日期加载到新列中,然后使用apply()函数从中创建新列。 - vb_rises
apply()函数将引用什么?我可以加载日期,但不确定如何仅从日期获取daily_high和daily_low。 - Ethan
1
可能需要更多时间是因为从URL获取数据需要更多时间?或者您可以尝试将数据保存到列表中,然后从列表创建数据框。例如:df = pd.DataFrame({'date':['FETCHED_DATES_LIST'], 'daily_high':[]})等等。 - Poojan
你使用JSON加载后,data是什么样子的?如果可以的话能显示一条记录吗? - vb_rises
将这些获取的数据存储在列表中比为每个拉取创建一个数据框并将其附加到较大的数据框中要高效得多。创建数据框对象比创建列表对象需要更多的开销。在完成所有获取操作后,从列表构建数据框。 - d_kennetz
@d_kennetz 这个方法最好!虽然运行了一分钟,但我认为这是最好的。谢谢! - Ethan
1个回答

3

pandas.DataFrame.append 不适合迭代操作。

文档中指出:

将行逐个追加到 DataFrame 中可能比单个连接更耗费计算资源。更好的方法是将这些行追加到列表中,然后一次性将列表与原始 DataFrame 连接。

正如提到的那样,串联结果会更有效率,但在您的情况下,使用pandas.DataFrame.from_dict会更方便。

此外,我建议使用requests库来请求 URL。

import requests

d = {}
d['date'] = []
d['daily_high'] = []
d['daily_low'] = []

for api_url in api_list:
    data = requests.get(api_url).json()
    d['date'].append(datetime.fromtimestamp(data["currently"]["time"]).strftime("20%y%m%d"))
    d['daily_high'].append(data["daily"]["data"][0]["temperatureHigh"])
    d['daily_low'].append(data["daily"]["data"][0]["temperatureLow"])
df = pd.DataFrame.from_dict(d)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接