You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取任意大小(含持续增长)DataFrame最后一行的高效方法

问题:高效获取持续增长DataFrame的最后一行并转为字典

我有一个持续增长的DataFrame,需要定期获取其最后一行并转为字典格式。当前DataFrame的信息如下:

# dbdf.info(memory_usage='deep')
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 6652 entries, 2022-10-23 17:15:00-04:00 to 2022-10-28 08:06:00-04:00
Freq: T
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   open    6592 non-null   float64
 1   high    6592 non-null   float64
 2   low     6592 non-null   float64
 3   close   6592 non-null   float64
dtypes: float64(4)
memory usage: 259.8 KB

目前我用的方法是:

bars = dbdf.to_dict(orient="records")
print(bars[-1])

这个方法在小数据量下可行,但如果DataFrame的行数和内存占用大幅增加,有没有更高效的通用最佳实践?


最优解决方案

你的当前方法存在明显的效率问题:dbdf.to_dict(orient="records")会把整个DataFrame转换成包含所有行的字典列表,时间和内存开销都是O(n)(n为总行数),当数据量持续增长时,这种做法会浪费大量资源。

更高效的做法是先提取最后一行,再转换为字典,开销仅为O(1),具体有两种常用方式:

1. 使用iloc[-1](通用最优)

这是最通用的方法,无论DataFrame的索引类型是什么都能直接获取最后一行:

last_row_dict = dbdf.iloc[-1].to_dict()
print(last_row_dict)
  • 原理:iloc[-1]直接定位到DataFrame的最后一行(返回一个Series),再调用to_dict()仅转换这一行的数据,完全不需要处理其他行。

2. 针对时间索引的专用方法(可选)

因为你的DataFrame是DatetimeIndex且有固定频率Freq: T(分钟级),也可以用last()方法:

last_row_dict = dbdf.last('1T').iloc[0].to_dict()
  • 注意:这个方法依赖于时间索引的频率设置,通用性不如iloc[-1],但在时间序列场景下语义更清晰。

性能对比

  • 原方法:数据量越大,内存占用和耗时会线性增长,比如百万行的DataFrame会生成一个包含百万个字典的列表,完全没必要。
  • 优化后的方法:无论DataFrame有多少行,只处理一行数据,内存占用几乎可以忽略,耗时稳定在微秒级。

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:25:18