pandas DataFrame按time规则新增多列报Performance Warning解决方法
问题原因
触发这个PerformanceWarning基本是两个写法问题:
- 用了链式索引在DataFrame副本上赋值,不仅弹警告,还经常出现值写不进原表的情况
- 每次来数据就逐行扫描找匹配time、逐列新增字段,导致DataFrame内存布局碎片化,数据量上去之后写入速度会下降明显
正确实现方案
把time字段设为DataFrame的唯一索引,基于索引做匹配更新,不用每次逐行扫描,也能避免碎片化写入问题:
- 初始化阶段先把time列设为索引,索引匹配的效率比每次布尔查询找行高几个量级
import pandas as pd # 初始化时直接设置time为唯一索引 df = df.set_index('time')
- 封装通用写入函数,支持一次写入单个或多个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
- 调用方式
# 单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
相关产品推荐
相关产品推荐

