如何低改动修复pandas append方法弃用触发的FutureWarning
警告触发原因
你收到的警告是因为pandas自1.4.0版本起正式废弃DataFrame.append()方法,该方法会在后续版本中被完全移除,官方推荐使用pandas.concat()实现相同的行追加效果,替换时不需要修改原有代码的前置计算逻辑,仅调整追加行的调用代码即可。
最小改动替换方式
pandas.concat()的作用是拼接多个pandas对象,逐行追加时只需要先把待追加的字典格式行转为单行DataFrame,再和原DataFrame传入concat即可,原有ignore_index=True的参数逻辑完全不变。
- 示例1修改后代码(仅替换append调用行,其余逻辑完全保留):
init_hour = pd.to_datetime('00:00:00') orig_hour = init_hour+timedelta(days=1) while init_hour < orig_hour: row = {'Hours': init_hour.time()} # 原代码: df = df.append(row, ignore_index = True) df = pd.concat([df, pd.DataFrame([row])], ignore_index=True) init_hour = init_hour + timedelta(minutes=60)
- 示例2修改后代码(同样仅替换append调用行):
row2 = {'date': tmp_date, 'false_negatives': fn, 'total': total} # 原代码: df2 = df2.append(row2, ignore_index = True) df2 = pd.concat([df2, pd.DataFrame([row2])], ignore_index=True)
可选性能优化(不强制改动)
不管是原来的append还是上面逐行调用concat的写法,每次执行都会生成一个全新的DataFrame对象,循环行数较多时性能较差。如果愿意做极小的逻辑调整,可以先把所有待追加的行存在普通Python列表里,循环结束后一次性拼接,性能会有明显提升,且不会影响你原有生成每行数据的计算逻辑:
init_hour = pd.to_datetime('00:00:00') orig_hour = init_hour+timedelta(days=1) # 用普通列表收集待追加的行 append_rows = [] while init_hour < orig_hour: row = {'Hours': init_hour.time()} append_rows.append(row) init_hour = init_hour + timedelta(minutes=60) # 一次性完成拼接 df = pd.concat([df, pd.DataFrame(append_rows)], ignore_index=True)
注意:这里列表调用的
append()是Python原生列表的方法,和pandas的DataFrame.append无关,可以正常使用不会触发警告。
内容的提问来源于stack exchange,提问作者Carola
相关产品推荐
相关产品推荐

