Pandas:基于多列索引合并两个时间序列数据框
合并两个DataFrame并保留所有行(全外连接)
没问题!要把这两个DataFrame合并成包含所有状态列且保留所有行的结果,用pandas的全外连接就能轻松实现,具体步骤如下:
核心代码实现
直接使用pd.merge()函数,指定全外连接模式即可:
import pandas as pd # 执行全外连接合并 merged_df = pd.merge( df_1, df_2, on=['session_id', 'user_id', 'timestamp'], # 基于这三列匹配行 how='outer' # 保留两个DataFrame的所有行 )
参数说明
on=['session_id', 'user_id', 'timestamp']:指定用来匹配两行是否属于同一记录的关联键,确保这三个列完全匹配的行会被合并到同一行中。how='outer':这是实现需求的关键参数,它会保留df_1和df_2中的每一行——如果某行在另一个DataFrame中没有匹配的关联键,对应的缺失列会自动用NaN填充。
示例验证
为了更直观地看到效果,我们可以构造测试数据来验证:
# 构造示例df_1 df_1 = pd.DataFrame({ 'session_id': ['s1', 's2', 's3'], 'user_id': ['u1', 'u2', 'u3'], 'timestamp': ['2024-01-01', '2024-01-02', '2024-01-03'], 'state1': [True, False, True], 'state2': [0, 1, 0] }) # 构造示例df_2 df_2 = pd.DataFrame({ 'session_id': ['s2', 's3', 's4'], 'user_id': ['u2', 'u3', 'u4'], 'timestamp': ['2024-01-02', '2024-01-03', '2024-01-04'], 'state3': ['active', 'inactive', 'active'], 'state4': [10, 20, 30] })
合并后的merged_df会包含以下内容:
- 来自
df_1的s1行(state3和state4为NaN) - 同时存在于两个DataFrame的
s2、s3行(所有状态列都有值) - 来自
df_2的s4行(state1和state2为NaN)
完全符合你“保留所有行、包含所有状态列”的需求。
内容的提问来源于stack exchange,提问作者Michal Hucko
相关产品推荐
相关产品推荐

