如何按条件合并两个DataFrame,用df1的duration填充df2空usageTime
按条件合并DataFrame解决方案
问题根因
你之前两次操作失败的核心原因是两个DataFrame的索引名、列名没有对齐:
- 使用
fillna时,pandas只会填充同列名、同索引位置的空值,你用到的df2列名为usageTime、df1列名为duration,列名不匹配自然无法完成空值填充。 - 使用
combine_first时,你仅修改了df1的列名,未同步修改df2的列名,导致df2的usageTime和df1的totalUsage被识别为两个独立字段,最终同时保留在结果中,不符合预期。
可行方案
提供三种可直接落地的实现方式:
方案1:fillna实现(最简洁)
先统一两个DataFrame的索引名和待填充列名,直接用fillna完成空值替换:
# 统一索引名、列名后填充空值 df3 = df2.rename_axis('device')\ .rename(columns={'usageTime': 'totalUsage'})\ .fillna(df1.rename(columns={'duration': 'totalUsage'}))
方案2:combine_first实现
对齐索引和列名后,基于combine_first的优先级规则(调用方非空值优先,参数内数据填充空值)实现:
df3 = df2.rename_axis('device')\ .rename(columns={'usageTime': 'totalUsage'})\ .combine_first(df1.rename(columns={'duration': 'totalUsage'}))
方案3:join+np.where实现(逻辑最直观)
先合并两个表的字段,再通过条件判断生成目标字段,方便后续调整取值规则:
import numpy as np # 按索引关联两个表 df_temp = df1.join(df2.rename_axis('device'), how='left') # 按条件生成totalUsage字段 df3 = pd.DataFrame( {'totalUsage': np.where(df_temp['usageTime'].isna(), df_temp['duration'], df_temp['usageTime'])}, index=df_temp.index )
运行验证
三种方案运行后输出结果完全符合预期:
totalUsage device 1110100 87.6 1110101 94.3 1110102 52.6 1110103 14.4
内容的提问来源于stack exchange,提问作者Hayrettin Basaraner
相关产品推荐
相关产品推荐

