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

使用map()函数匹配DataFrame ID与名称的报错问题求助

问题与解决方案

数据与需求

现有两个DataFrame:

  • daily_input:每日输入数据,包含日期、ID和对应值
  • catalog:ID目录表,包含ID对应的名称

数据如下:

import pandas as pd

# daily_input数据
daily_input = pd.DataFrame({
    'date': ['2010-03-01', '2010-10-14', '2010-12-18'],
    'id': [2, 1, 3],
    'value': [57.9, 79.1, 0.0]
})
daily_input['date'] = pd.to_datetime(daily_input['date'])

# catalog数据
catalog = pd.DataFrame({
    'name': ['aba', 'aba-1', 'aba-2', 'aba', 'aba-2'],
    'id': [1, 2, 3, 4, 5]
})

需求:编写函数,先根据ID匹配对应名称,再判断:若名称为aba-1且日期为周六(dayofweek=5)则返回50,否则返回25。

用户原代码执行时报错:map() must have at least two arguments,错误出在函数的条件判断行。

目标输出:

date  id  num
0 2010-03-01   2   25
1 2010-10-14   1   25
2 2010-12-18   3   25

错误原因

原代码中map(catalog.set_index("id")["name"])的用法完全错误:

  • map()函数需要至少两个参数(映射函数+可迭代对象),此处仅传入了一个Series,不符合语法要求
  • 逻辑上是要根据当前传入的id查找对应名称,而非对整个Series做映射操作

修正方案

步骤1:构建ID到名称的映射字典

先将catalog转换为ID为键、名称为值的字典,这样可以高效通过ID查找对应名称:

id_to_name = catalog.set_index('id')['name'].to_dict()

步骤2:修正判断逻辑

重构函数,先通过ID获取名称,再按条件返回对应值:

def numfunc(id, date):
    # 根据ID获取对应名称,若ID不存在则返回空字符串
    name = id_to_name.get(id, "")
    # 满足双重条件返回50,否则返回25
    if name == "aba-1" and date.dayofweek == 5:
        return 50
    else:
        return 25

步骤3:应用函数并生成结果

将函数应用到daily_input,提取目标列:

daily_input['num'] = daily_input.apply(lambda x: numfunc(x['id'], x['date']), axis=1)
# 提取所需列得到目标输出
result_df = daily_input[['date', 'id', 'num']]
print(result_df)

结果验证

目标输出中的日期:

  • 2010-03-01是周一(dayofweek=0),即使ID=2对应aba-1,也不满足周六的条件,返回25
  • 其余ID对应的名称均不是aba-1,因此全部返回25,与预期输出一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:15:19