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

Python Pandas合并新旧行DataFrame:按更新时间保留最新数据

合并同索引DataFrame并保留最新数据(含缺失值填充)

这是个很实用的DataFrame合并需求,我会结合你给出的示例,一步步实现你要的逻辑:保留同索引行中更新时间较晚的数据,同时用旧行的值填充新行缺失的字段。

第一步:构造完整的示例数据

你给出的df1没有包含更新时间字段,我先给它补上,再构造一个df2作为更新后的数据集,方便演示:

import pandas as pd

# 初始化你提供的df1,并添加更新时间字段
df1 = pd.DataFrame(
    {'Hugo' : {'age' : 21, 'weight' : 75}, 
     'Niklas': {'age' : 46, 'weight' : 65}, 
     'Ronald' : {'age' : 76, 'weight' : 85, 'height' : 176}}
).T
df1.index.names = ['name']
df1['update_time'] = '2024-04-30'  # 假设df1是旧数据,更新时间更早

# 构造df2作为新数据,包含更新时间,部分字段有缺失
df2 = pd.DataFrame(
    {
        'age': [22, 47, 76],
        'weight': [78, None, 85],  # Niklas的weight字段缺失
        'height': [180, None, None],  # 新增height字段,部分值缺失
        'update_time': ['2024-05-01', '2024-05-02', '2024-04-29']  # Ronald的更新时间比df1早
    },
    index=['Hugo', 'Niklas', 'Ronald']
)
df2.index.names = ['name']

现在df1和df2的结构如下:

  • df1:旧数据,包含age、weight、height(仅Ronald有值)、update_time
  • df2:新数据,部分字段缺失,更新时间有早有晚

第二步:对齐列并判断更新优先级

首先要确保两个DataFrame的列完全一致,避免合并时丢失字段;然后判断每个索引对应的行,哪个更新时间更晚:

# 对齐两个df的列,补全缺失的列
all_columns = df1.columns.union(df2.columns)
df1_aligned = df1.reindex(columns=all_columns)
df2_aligned = df2.reindex(columns=all_columns)

# 生成mask:标记df2的更新时间是否晚于df1
is_df2_latest = df2_aligned['update_time'] > df1_aligned['update_time']

第三步:合并数据并填充缺失值

核心逻辑是:

  1. 优先选择更新时间较晚的行的数据
  2. 如果更新晚的行存在缺失字段,用更新早的行的对应字段值填充
# 初始化结果DataFrame
result = pd.DataFrame(index=df1_aligned.index)

for col in all_columns:
    if col == 'update_time':
        # 更新时间直接取两者中较晚的那个
        result[col] = df2_aligned['update_time'].where(is_df2_latest, df1_aligned['update_time'])
    else:
        # 先取更新晚的行的字段值
        result[col] = df2_aligned[col].where(is_df2_latest, df1_aligned[col])
        # 填充缺失:如果当前值为空,用另一个df的对应值补充
        result[col] = result[col].fillna(
            df1_aligned[col].where(~is_df2_latest, df2_aligned[col])
        )

第四步:查看最终结果

运行完上面的代码后,result就是符合要求的合并后数据:

  • Hugo:取df2的更新数据(更新时间晚)
  • Niklas:取df2的age和更新时间,但weight字段用df1的65填充(因为df2的weight缺失)
  • Ronald:取df1的所有数据(因为df2的更新时间更早)

你可以用print(result)查看具体内容,完全符合你提出的规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:29:18