Pandas如何将DataFrame仅合并到重复时间戳索引的指定行
解决方案
要实现仅将时长数据合并到对应重复索引的idle状态行,其余行保留NaN,可以通过左连接+状态过滤的方式快速实现,以下是具体步骤和代码示例:
假设你的两个DataFrame分别为:
df_status:以时间戳为索引,包含status列(值为finish或idle),存在重复索引df_duration:以时间戳为索引,包含duration列(存储时长数据)
方法一:左连接后按状态过滤(推荐)
先通过索引左连接两个DataFrame,再将非idle状态行的时长列置空:
import pandas as pd # 按索引左连接,保留df_status的所有行 merged_df = df_status.join(df_duration, how='left') # 将非idle状态的duration设为NaN merged_df.loc[merged_df['status'] != 'idle', 'duration'] = pd.NA
这种方法直接高效,不需要拆分数据,仅需两步即可完成需求,且能完整保留原DataFrame的所有行和索引结构。
方法二:拆分合并(适合复杂场景)
如果需要更精细化的控制,可以先拆分df_status为idle和非idle两部分,仅给idle部分合并时长后再拼接回去:
# 拆分状态数据 idle_rows = df_status[df_status['status'] == 'idle'] non_idle_rows = df_status[df_status['status'] != 'idle'] # 仅给idle行合并时长 idle_rows = idle_rows.join(df_duration) # 合并回原结构并保持索引顺序 merged_df = pd.concat([non_idle_rows, idle_rows]).sort_index()
关键说明
- 两种方法都不会修改原DataFrame的索引结构,所有重复索引行都会被保留
- 使用
pd.NA而非np.nan是为了适配Pandas的 nullable 数据类型,若使用旧版本Pandas也可替换为np.nan
内容的提问来源于stack exchange,提问作者Joost Lenten
相关产品推荐
相关产品推荐

