将df.append替换为pd.concat构建对比DataFrame的最优方法咨询
替换df.append并优化代码的最优方案
核心思路是别在循环里反复拼接DataFrame,先把所有要加的行数据攒到一个列表里,最后一次性生成(或合并)DataFrame——既解决了append弃用的问题,还能大幅提升代码效率。
具体改写步骤:
先初始化一个空列表存行数据
别再初始化空DataFrame了,用列表装每行的字典更高效:rows = []改写第一段循环
把重复调用的split抽出来,减少重复计算,然后把每行数据塞进列表:# 处理第一组索引 for x in {0,7,8,9,10,11,12,13,14,15,18,19,21,23}: d1_parts = data1[x].split(':') d2_parts = data2[x].split(':') rows.append({ 'col1': d1_parts[0], 'col2': d1_parts[1][:-1], 'col3': d2_parts[1][:-1], 'col4': data2[x] == data1[x], 'col5': '---' })改写第二段(及其他)循环
同样提前拆分数据,计算差值时先转好数值存变量,代码更清爽:# 处理第二组索引,计算数值差 for x in {4,2,5}: d1_parts = data1[x].split(':') d2_parts = data2[x].split(':') val1 = float(d1_parts[1][:-1]) val2 = float(d2_parts[1][:-1]) rows.append({ 'col1': 'SOMENEWROWNAME', 'col2': d1_parts[1][:-1], 'col3': d2_parts[1][:-1], 'col4': data2[x] == data1[x], 'col5': val2 - val1 })一次性生成最终DataFrame
所有行都攒好后,直接转成DataFrame:header = pd.DataFrame(rows)
如果要追加到已有DataFrame
要是你需要在已有的header上新加行,就用pd.concat一次性合并,别循环加:
new_rows = [] # 循环填充new_rows... header = pd.concat([header, pd.DataFrame(new_rows)], ignore_index=True)
为啥这么改?
- 原
append每次循环都会生成新DataFrame,数据量大的时候慢到离谱,用列表攒数据再一次性生成,效率提升不止一个档次 - 把重复的
split、类型转换抽出来,减少冗余计算,代码也更容易读和维护 - 逻辑更清晰,所有行数据的收集和生成分开,出问题也好排查
内容的提问来源于stack exchange,提问作者DM71
相关产品推荐
相关产品推荐

