如何快速简便地对Pandas DataFrame执行AddOrUpdate操作?
实现Pandas DataFrame的AddOrUpdate(添加/更新)操作
需求说明
针对指定DataFrame完成两类操作:
- 更新已有索引行的指定列值
- 添加原始DataFrame中不存在的新索引行
实现代码
1. 定义原始数据与变更列表
import pandas as pd # 原始DataFrame df = pd.DataFrame([ {'A':'a1','B':'b1','C':'c1'}, {'A':'a3','B':'b2','C':'c2'}, {'A':'a3','B':'b3','C':'c3'}, ]) # 变更列表:id对应目标行索引 changes = [ {'id':0, 'A':'aNEW','C':'cNEW'}, {'id':2, 'B':'bNEW'}, {'id':3, 'A':'aNEW','C':'cNEW'}, ]
2. 核心实现逻辑
# 把变更列表转为以id为索引的DataFrame changes_df = pd.DataFrame(changes).set_index('id') # 更新已有行:仅替换原始DataFrame中存在的索引行的指定列 df.update(changes_df.reindex(df.index)) # 添加新行:筛选出变更中未在原始索引里的行,追加到DataFrame new_rows = changes_df[~changes_df.index.isin(df.index)] df = pd.concat([df, new_rows]).sort_index()
3. 封装成自定义方法(可选)
如果需要类似df.UpdateOrAdd(changes)的便捷调用方式,可封装成函数:
def update_or_add(df, changes): changes_df = pd.DataFrame(changes).set_index('id') df.update(changes_df.reindex(df.index)) new_rows = changes_df[~changes_df.index.isin(df.index)] return pd.concat([df, new_rows]).sort_index() # 调用示例 df = update_or_add(df, changes)
最终结果
执行后得到目标DataFrame:
A B C 0 aNEW b1 cNEW 1 a3 b2 c2 2 a3 bNEW c3 3 aNEW None cNEW
关键说明
df.update():原地更新已有行,仅替换非空值,保留原始行未指定的列数据- 索引筛选+
concat:确保仅添加原始DataFrame中不存在的新行 sort_index:保证最终行顺序按索引升序排列
内容的提问来源于stack exchange,提问作者ljilekor
相关产品推荐
相关产品推荐

