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

基于索引合并两个pandas DataFrame,去重右表重复行且左表数据优先

Pandas 合并同索引K线DataFrame方案(重叠索引保留左表数据)

针对合并两个同结构、同symbol+date组合索引的K线DataFrame,重叠索引优先保留左表(旧历史数据)、仅补充右表(API新数据)新增行的需求,以下是三种可行实现:


方案1:combine_first(优先推荐,代码最简性能最优)

该方法天然符合需求,会自动对齐索引,优先保留调用方(左表)的所有数据,仅补充右表存在但左表缺失的索引行:

# 假设左表(历史CSV数据)命名为 df_old,右表(API新数据)命名为 df_new
final_df = df_old.combine_first(df_new)

# 可选操作:统一数值精度,消除右表多余的小数尾缀
final_df = final_df.round({
    "open": 2, "high": 2, "low": 2, "close": 2, "volume": 6
})

方案2:concat + 索引去重(逻辑直观易理解)

如果习惯用concat操作,可先拼接再按索引去重,保留先出现的左表数据即可:

import pandas as pd

# 按行拼接两个表,左表放前面保证重复时优先保留
concat_df = pd.concat([df_old, df_new], axis=0)
# 按索引去重,keep='first'表示保留首次出现的行(即左表数据)
final_df = concat_df[~concat_df.index.duplicated(keep='first')]

方案3:merge左外连接(严格对应SQL左连接逻辑)

如果需要对齐SQL左外连接的写法,可通过merge实现,需要单独处理同名列的取值逻辑:

# 按索引做外连接,保留两边所有行,同名列加后缀区分
merge_df = df_old.merge(
    df_new,
    left_index=True,
    right_index=True,
    how="outer",
    suffixes=("_old", "_new")
)

# 优先取旧表数值,旧表为空时取新表数值
for col in ["open", "high", "low", "close", "volume"]:
    merge_df[col] = merge_df[f"{col}_old"].fillna(merge_df[f"{col}_new"])

# 只保留需要的业务列
final_df = merge_df[["open", "high", "low", "close", "volume"]]

注意:上述三种方案输出的结果完全等价,生产环境优先选方案1即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:36:03