使用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
相关产品推荐
相关产品推荐

