Pandas:如何更新DataFrame并追加新条目?
解决pandas中同时更新已有索引值并追加新索引行的问题
你遇到的情况是DataFrame.update()方法的预期行为——它只会更新调用者(df1)中已存在的索引和列对应的数值,不会自动添加新的行或列。要实现「更新已有值+追加新索引行」的需求,针对pandas 1.1.5版本,有两种简单可靠的方案:
方案1:先更新,再追加新行
这个方法逻辑清晰,分两步完成需求:
- 先用
update()完成已有索引的数值更新 - 提取df2中df1没有的索引行,追加到df1中
代码示例
import pandas as pd # 构造你的原始数据 df1 = pd.DataFrame( {'Revenue': [100, 500, 200], 'Profit': [300, 900, 100], 'Sales': [1, 3, 4]}, index=[0, 1, 2] ) df2 = pd.DataFrame( {'Sales': [10, 12]}, index=[0, 6] ) # 第一步:更新已有索引的对应值 df1.update(df2) # 第二步:提取df2中df1没有的索引,追加到df1 new_rows = df2.loc[df2.index.difference(df1.index)] df1 = pd.concat([df1, new_rows]).sort_index() print(df1)
输出结果
Revenue Profit Sales 0 100.0 300.0 10.0 1 500.0 900.0 3.0 2 200.0 100.0 4.0 6 NaN NaN 12.0
方案2:用concat+groupby一步到位
如果想更简洁,可以通过pd.concat()合并两个DataFrame,再按索引分组取最后一行(因为df2的行在concat后排在df1后面,会覆盖之前的数值):
代码示例
import pandas as pd # 构造原始数据(同上) df1 = pd.DataFrame( {'Revenue': [100, 500, 200], 'Profit': [300, 900, 100], 'Sales': [1, 3, 4]}, index=[0, 1, 2] ) df2 = pd.DataFrame( {'Sales': [10, 12]}, index=[0, 6] ) # 合并后按索引分组,取最后一行(即优先保留df2的更新值) df_combined = pd.concat([df1, df2]).groupby(level=0).last() print(df_combined)
输出结果和方案1完全一致,同样满足你的需求。
注意事项
- 两种方法都能保留df1原有的列顺序,新行中不存在的列会自动填充
NaN - 方案2更简洁,但如果你的DataFrame有大量重复索引(非本例情况),需要确认分组逻辑符合预期
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

