You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas DataFrame按time规则新增多列报Performance Warning解决方法

问题原因

触发这个PerformanceWarning基本是两个写法问题:

  • 用了链式索引在DataFrame副本上赋值,不仅弹警告,还经常出现值写不进原表的情况
  • 每次来数据就逐行扫描找匹配time、逐列新增字段,导致DataFrame内存布局碎片化,数据量上去之后写入速度会下降明显
正确实现方案

把time字段设为DataFrame的唯一索引,基于索引做匹配更新,不用每次逐行扫描,也能避免碎片化写入问题:

  1. 初始化阶段先把time列设为索引,索引匹配的效率比每次布尔查询找行高几个量级
import pandas as pd
# 初始化时直接设置time为唯一索引
df = df.set_index('time')
  1. 封装通用写入函数,支持一次写入单个或多个vlan列的值
def write_entry(df, time_val, value_map: dict):
    """
    写入新条目
    :param df: 目标DataFrame,要求已将time设为索引
    :param time_val: 新条目的time值
    :param value_map: 待写入的列名与值的映射,比如{"vlan3": 100, "vlan4": 200}
    """
    new_entry = pd.DataFrame([value_map], index=[time_val])
    if time_val in df.index:
        # time已存在:按索引匹配更新对应列,原表没有的列会自动新增
        df.update(new_entry)
    else:
        # time不存在:直接拼接新行
        df = pd.concat([df, new_entry])
    return df
  1. 调用方式
# 单vlan列写入
df = write_entry(df, time_val="2024-05-01 12:00", value_map={"vlan3": 950})
# 一次写入多个vlan列
df = write_entry(df, time_val="2024-05-01 12:05", value_map={"vlan3": 880, "vlan5": 920})
注意事项
  • 如果写入频率很高、数据量超过10万行,可以每写入几百条数据后执行一次df = df.copy(),重新整理内存布局,彻底消除碎片化影响
  • 不要写df[df['time'] == xxx]['vlan3'] = val这种链式赋值代码,这种写法操作的是pandas生成的临时副本,值根本不会写入原DataFrame

内容的提问来源于stack exchange,提问作者CodeSleepEat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:36:08