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

如何按条件合并两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:57:03