获取任意大小(含持续增长)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
相关产品推荐
相关产品推荐

