如何用Pandas实现DataFrame列更新及新增ID数据合并?
解决方案:实现DataFrame的更新与新增行需求
你提到的pd.DataFrame.update确实只能更新已存在的行,无法添加新记录。这里有两种简单的方法可以满足你的需求——既用df2更新df1的现有ID值,又把df2中的新ID数据补充到df1里。
方法一:先更新现有行,再追加新行
这种方法逻辑直观,先完成现有ID的更新,再手动添加df2独有的新数据:
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({'ID': ['ID1', 'ID2', 'ID3', 'ID4'], 'A': [5, 6, 7, 8]}) df2 = pd.DataFrame({'ID': ['ID1', 'ID2', 'ID3', 'ID5', 'ID6', 'ID7'], 'A': [5, 1, 8, 7, 8, 9]}) # 1. 复制df1避免修改原数据,将ID设为索引方便匹配 updated_df1 = df1.copy().set_index('ID') df2_idx = df2.set_index('ID') # 2. 用df2更新df1中已存在的ID的A值 updated_df1.update(df2_idx) # 3. 筛选df2中不在df1里的新ID,追加到结果中 new_records = df2_idx[~df2_idx.index.isin(updated_df1.index)] updated_df1 = pd.concat([updated_df1, new_records]).reset_index() # 查看最终结果 print(updated_df1)
运行后输出与你期望的完全一致:
ID A 0 ID1 5 1 ID2 1 2 ID3 8 3 ID4 8 4 ID5 7 5 ID6 8 6 ID7 9
方法二:合并后分组取最新值
这种方法更简洁,利用concat合并两个DataFrame,再按ID分组保留最后出现的记录(因为把df2放在后面,确保它的优先级更高):
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({'ID': ['ID1', 'ID2', 'ID3', 'ID4'], 'A': [5, 6, 7, 8]}) df2 = pd.DataFrame({'ID': ['ID1', 'ID2', 'ID3', 'ID5', 'ID6', 'ID7'], 'A': [5, 1, 8, 7, 8, 9]}) # 合并df1和df2,df2后置保证重复ID取df2的值 combined = pd.concat([df1, df2]) # 按ID分组,保留每组最后一行并重置索引 updated_df1 = combined.groupby('ID', as_index=False).last() # 查看最终结果 print(updated_df1)
这个方法的输出结果和方法一完全相同,代码更简洁,适合快速实现需求。
两种方法的适用场景
- 方法一优势是步骤清晰可控,适合需要在更新/追加前做额外数据校验、转换的场景;
- 方法二更轻量化,适合不需要中间步骤处理的快速合并需求。
内容的提问来源于stack exchange,提问作者Mohit Aneja
相关产品推荐
相关产品推荐

