将Pandas中append方法替换为concat改写Capterra API数据代码
适配新版Pandas的Capterra API数据获取代码改写
Pandas 2.0+ 已弃用DataFrame.append()方法,官方推荐使用pd.concat()替代。下面是针对你的代码的改写,同时优化了循环中逐行添加数据的性能(避免循环内频繁创建DataFrame):
关键改动点
- 替换
cp_data_df.append(record, ...):不再循环逐行添加字典,而是先将所有API返回的record收集到列表中,最后一次性转为DataFrame,性能更优。 - 替换
data.append(cp_data_df, ...):用pd.concat()合并DataFrame,符合新版Pandas规范。
改写后的完整代码
from datetime import date, timedelta import requests import json import pandas as pd for i in range(1, 2): # time.sleep(10) last_date = date.today() - timedelta(days=i) print(last_date) data = pd.DataFrame() for category in category2: # 重命名变量避免和外层循环i冲突 url = f"https://public-api.capterra.com/v1/clicks?start_date={last_date}&end_date={last_date}&category={category}" headers = {"Authorization": ""} # 记得填入你的授权token r = requests.get(url=url, headers=headers) # Data extract to csv cp_data_df = pd.DataFrame() if r.status_code != 200: print("\n*** something went wrong *** ", r) r.raise_for_status() else: response_dict = json.loads(r.text) if "data" in response_dict and response_dict["data"]: # 先收集所有record到列表,再一次性转DataFrame records_list = [] for record in response_dict["data"]: records_list.append(record) cp_data_df = pd.DataFrame(records_list) grp_instances = ["category"] cp_data_df = cp_data_df.groupby(grp_instances).sum("cost").reset_index() cp_data_df["Date"] = last_date # 用concat替代append合并到data data = pd.concat([data, cp_data_df], ignore_index=True) data2 = data.drop_duplicates(subset=['category']) data2['Date'] = pd.to_datetime(data2['Date']).dt.floor('D') # 替代astype的更清晰写法
额外说明
- 重命名了内层循环的变量
i为category,避免和外层循环的i变量冲突,提升代码可读性。 - 使用f-string重构了URL拼接,比字符串拼接更简洁易读。
- 日期处理改用
dt.floor('D'),比直接astype更符合Pandas日期操作的规范。
内容的提问来源于stack exchange,提问作者Serg Neverov
相关产品推荐
相关产品推荐

