基于索引合并两个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
相关产品推荐
相关产品推荐

