Pandas向DataFrame添加数据点速度过慢,有什么更快的实现方法?
性能瓶颈原因
你当前的逐行循环写法效率极低,核心问题有两点:
- 每次循环都要对
dataframe_var做全表扫描匹配Alias对应的行索引,整体时间复杂度为O(n²),数据规模稍大就会产生巨量冗余计算 - 循环内逐次给DataFrame新增列、单值赋值的操作,会触发pandas频繁的内存重分配和拷贝,额外开销远大于计算本身
高效实现方法
用pandas内置的向量化操作替代Python层循环,全程无逐行迭代,处理中等规模数据集可以把耗时从数小时压缩到毫秒级,代码如下:
import pandas as pd # 透视生成行列映射宽表:行为Alias,列为TS_ns,值为对应VALUE_NUMBER,自动填充缺失值为NaN pivot_table = file_data.pivot(index="Alias", columns="TS_ns", values="VALUE_NUMBER") # 和原有DataFrame按Channel对齐,保留原有Channel的行顺序 dataframe_var = dataframe_var.merge( pivot_table, left_on="Channel", right_index=True, how="left" ) # 对时间列按数值大小升序重排 time_columns = sorted( [col for col in dataframe_var.columns if col != "Channel"], key=lambda x: float(x) ) dataframe_var = dataframe_var[["Channel"] + time_columns]
补充说明
- 如果你提供的示例里Name_1对应值
0.116要转成116000是真实业务需求,只需要在透视前加一行file_data["VALUE_NUMBER"] = file_data["VALUE_NUMBER"] * 1e6即可 - 如果存在同一个Alias同一个TS_ns对应多条数据的情况,把
pivot替换成pivot_table,指定聚合函数即可,比如pivot_table(index="Alias", columns="TS_ns", values="VALUE_NUMBER", aggfunc="first") - 该实现的性能提升幅度在10000倍以上,百万行级数据也能在数秒内完成计算
内容的提问来源于stack exchange,提问作者Gianluca Bianco
相关产品推荐
相关产品推荐

