如何更高效地向已有DataFrame追加新数据?(Python)
高效向Pandas DataFrame追加数据的优化方案
问题描述
在Python中,是否存在更高效的方式向已有DataFrame追加新数据?如下例所示,先导入现有DataFrame(frame_orig),执行相关代码生成新值后,将其追加至原DataFrame再导出。当前方法可正常运行,但当原DataFrame数据量过大时,整个流程耗时较长。请问是否可以直接以列表形式追加新值,或是通过调整原DataFrame的类型来优化?
用户示例代码:
import pandas as pd #frame_orig = pd.read_csv('C:/path/to/file/frame_orig.csv') frame_orig = pd.DataFrame({'Val1': ['1','2'], 'Val2': ['3','4'], }) ##some code new_Val1 = '5000' new_Val2 = '6000' newvalues = [] newvalues.append([new_Val1, new_Val2]) df_values = pd.DataFrame(newvalues, columns = ['Val1','Val2']) new_df = pd.concat([frame_orig, df_values], ignore_index=True)
优化方案
1. 单行追加:直接使用loc赋值
如果仅追加单行数据,无需创建临时DataFrame,直接通过loc定位到新行赋值,避免额外的内存开销:
# 直接追加单行 frame_orig.loc[len(frame_orig)] = [new_Val1, new_Val2]
注意:若需频繁追加大量行,不建议逐行调用loc,因为每次操作都会触发DataFrame的内存重分配,累积下来性能会下降。
2. 批量追加:先攒数据再一次性合并
如果要追加多行,先把所有新数据收集到列表中,最后一次性转换为DataFrame并合并,这是批量场景下效率最高的方式:
# 批量收集新数据 new_data_list = [] new_data_list.append(['5000', '6000']) new_data_list.append(['7000', '8000']) # 可循环生成更多数据... # 一次性合并到原DataFrame frame_orig = pd.concat( [frame_orig, pd.DataFrame(new_data_list, columns=frame_orig.columns)], ignore_index=True )
这种方式减少了多次内存操作的次数,尤其适合原DataFrame数据量较大的场景。
3. 优化数据类型降低内存占用
如果原DataFrame的列类型存在优化空间(比如示例中Val1、Val2存储为字符串,但实际是数值),提前指定或转换类型能大幅减少内存占用,间接提升后续所有操作的速度:
# 读取CSV时直接指定列类型 frame_orig = pd.read_csv( 'C:/path/to/file/frame_orig.csv', dtype={'Val1': int, 'Val2': int} ) # 或者对已有的DataFrame转换类型 frame_orig = frame_orig.astype({'Val1': int, 'Val2': int})
内存占用降低后,合并、导出等IO密集型操作的速度会明显提升。
4. 旧版本兼容:使用append(不推荐)
如果你的环境仍在使用Pandas 2.0以下版本,可以用append方法简化单行追加,但该方法已被官方标记为弃用,优先推荐前面的方案:
# 仅适用于Pandas 2.0以下版本 frame_orig = frame_orig.append( pd.Series([new_Val1, new_Val2], index=frame_orig.columns), ignore_index=True )
内容的提问来源于stack exchange,提问作者jonboy
相关产品推荐
相关产品推荐

