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

如何按匹配条件给DataFrame列赋值,解决np.where和pd.merge报错

错误原因分析

  • 调用np.where报错:df1与df2行数不一致,两个日期列的索引无法对齐,不支持直接逐元素比较。
  • 调用merge报错:两个表用于关联的日期列数据类型不统一,一个为object(字符串)类型,另一个为datetime64时间类型,无法直接匹配。同时你使用了inner内连接,就算类型匹配也会丢失df1中匹配不到日期的行,不符合保留全量df1数据的需求。

解决代码

首先统一两个表日期列的类型与关联字段名,再用左连接匹配,最后空值填充为0即可:

import pandas as pd
import numpy as np

# 1. 统一两个表的日期列为相同的datetime类型,避免类型冲突
df1['date'] = pd.to_datetime(df1['date'])
df2['date'] = pd.to_datetime(df2['Date'])

# 2. 预处理df2,只保留需要的字段,并将percent重命名为目标列名per
df2_for_merge = df2[['date', 'percent']].rename(columns={'percent': 'per'})

# 3. 左连接合并,保留df1的全部行
result = pd.merge(df1, df2_for_merge, on='date', how='left')

# 4. 匹配不到的空值填充为0,得到最终结果
result['per'] = result['per'].fillna(0)

如果需要保留日期为原字符串格式,最后可以加一行转换:

result['date'] = result['date'].dt.strftime('%m/%d/%Y').str.lstrip('0')

结果说明

如果按照日期全匹配逻辑,运行后df1中所有日期和df2匹配的行都会取对应percent值,不匹配的行per为0。若你需要的是仅匹配首次出现的同日期行,可以额外对df2的匹配结果做去重处理,调整匹配规则即可。

内容的提问来源于stack exchange,提问作者pylearner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:54:04