如何合并两个DataFrame:保留首个DataFrame时间戳,缺失值填充NaN
解决方法
你需要的是**左连接(left join)**而非内连接或concat,具体实现步骤如下:
1. 统一时间戳类型
首先确保两个DataFrame的timestamp列均为datetime类型(seconddf的原始数据是字符串,必须转换才能正确匹配):
import pandas as pd # 生成firstdf(原代码不变) daterange = pd.date_range(start='1/1/2023 09:30:00', end='1/3/2023 09:35:00', freq='min') daterange_keep = (pd.DatetimeIndex(pd.to_datetime(daterange)) .indexer_between_time('09:30', '09:35') ) firstdf= pd.DataFrame(daterange[daterange_keep]) firstdf.columns = ['timestamp'] # 转换seconddf的时间戳类型 seconddf = pd.DataFrame({'timestamp': ['2023-01-01 09:30:00', '2023-01-01 09:32:00', '2023-01-01 09:34:00', '2023-02-01 09:30:00'], 'value': [3,5,7,9]}) seconddf['timestamp'] = pd.to_datetime(seconddf['timestamp'])
2. 左连接合并DataFrame
使用merge的how='left'参数,会保留firstdf的所有时间戳,匹配seconddf中对应的值,无匹配的位置自动填充NaN,同时自动丢弃seconddf中不在firstdf范围内的数据:
merged_df = firstdf.merge(seconddf, on='timestamp', how='left')
3. 重命名value列
用rename方法独立完成列名修改,替换为你需要的名称:
merged_df = merged_df.rename(columns={'value': '目标列名'})
最终输出示例
运行后merged_df的核心结果片段如下:
| timestamp | 目标列名 |
|---|---|
| 2023-01-01 09:30:00 | 3 |
| 2023-01-01 09:31:00 | NaN |
| 2023-01-01 09:32:00 | 5 |
| 2023-01-01 09:33:00 | NaN |
| 2023-01-02 09:30:00 | NaN |
关于concat的说明
concat仅用于按行/列直接拼接DataFrame,不支持基于键(时间戳)的匹配合并场景,你的需求本质是基于时间戳的左连接匹配,merge(how='left')才是正确方案。
内容的提问来源于stack exchange,提问作者Allure
相关产品推荐
相关产品推荐

