如何在Pandas DataFrame中用.concat替代.append方法?
解决pandas append弃用警告的方案
原始问题内容
代码
dataframe = pd.DataFrame(columns = my_columns) for stock in stocks['Ticker'][:1]: api_url = f'https://sandbox.iexapis.com/stable/stock/{symbol}/quote/?token={IEX_CLOUD_API_TOKEN}' data = requests.get(api_url).json() dataframe = dataframe.append( pd.Series([stock, data['latestPrice'], marketCap/1000000000000], index = my_columns), ignore_index = True ) dataframe
运行结果
| Ticker | Stock Price | Market Cap |
|---|---|---|
| A | 153.57 | 2.37218 |
警告信息
FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
dataframe = dataframe.append(
疑问
知道要改用列表收集数据,但不知道怎么处理原来的Series。
修改方案
方案1:放弃Series,直接用字典存数据(推荐)
这种方式更简洁,无需依赖Series,直接构造对应列名的字典存入列表,最后一次性转为DataFrame:
# 初始化空列表存储每行数据 data_list = [] my_columns = ['Ticker', 'Stock Price', 'Market Cap'] for stock in stocks['Ticker'][:1]: api_url = f'https://sandbox.iexapis.com/stable/stock/{symbol}/quote/?token={IEX_CLOUD_API_TOKEN}' data = requests.get(api_url).json() # 构造匹配列名的字典 row_data = { 'Ticker': stock, 'Stock Price': data['latestPrice'], 'Market Cap': marketCap / 1000000000000 } data_list.append(row_data) # 列表转DataFrame dataframe = pd.DataFrame(data_list, columns=my_columns)
方案2:保留Series,转为单行DataFrame后存入列表
如果一定要保留Series的用法,可将其转成单行DataFrame后存入列表,最后用pd.concat合并:
data_list = [] my_columns = ['Ticker', 'Stock Price', 'Market Cap'] for stock in stocks['Ticker'][:1]: api_url = f'https://sandbox.iexapis.com/stable/stock/{symbol}/quote/?token={IEX_CLOUD_API_TOKEN}' data = requests.get(api_url).json() # 将Series转为单行DataFrame(.to_frame().T实现转置) row_df = pd.Series( [stock, data['latestPrice'], marketCap/1000000000000], index=my_columns ).to_frame().T data_list.append(row_df) # 合并所有行DataFrame dataframe = pd.concat(data_list, ignore_index=True)
核心原因
append方法每次调用都会生成新的DataFrame对象,数据量大时效率极低。改用列表收集数据再一次性转换/合并,既能消除警告,还能大幅提升运行效率,这也是pandas官方推荐的替代方案。
内容的提问来源于stack exchange,提问作者Carlo M
相关产品推荐
相关产品推荐

