如何将以日期为键、DataFrame为值的字典与带日期列的DataFrame合并
错误原因
if key == df['date']是单个datetime值与pandas Series做等值比较,返回的是布尔类型的Series,无法直接作为if判断的条件,因此抛出The truth value of a Series is ambiguous错误。- 代码中
dict.items是方法对象,需要加括号写成dict.items()才能遍历字典的键值对。 - 合并逻辑存在问题:
left_on = ['team_1','team_2']传入了两个列,而right_on = 'team'只有一个列,二者长度不匹配,即使解决了判断错误也无法完成合并。 - 注意不要使用
dict作为变量名,它是Python内置的字典类型关键字,会覆盖原有功能,建议重命名为date_rating_dict等自定义名称。
可行解决方案
核心思路是先将日期为键的字典转换为统一的带日期字段的评分总表,再分别匹配team1和team2的评分。
完整可运行代码
import pandas as pd import datetime as dt # 构造示例数据 date_rating_dict = { dt.datetime(2021,11,1): pd.DataFrame({'team':['horses','eagles'], 'rating':[15,20]}), dt.datetime(2021,11,2): pd.DataFrame({'team':['horses','eagles'], 'rating':[35,50]}) } df = pd.DataFrame({ 'date':[dt.datetime(2021,11,1), dt.datetime(2021,11,2)], 'team_1':'horses', 'team_2':'eagles' }) # 步骤1:将字典转换为带date列的总评分表 rating_total = pd.concat( [df.assign(date=date) for date, df in date_rating_dict.items()], ignore_index=True ) # 步骤2:分别匹配team1和team2的评分 # 匹配team1评分 df = df.merge( rating_total, left_on=['date', 'team_1'], right_on=['date', 'team'], how='left' ).rename(columns={'rating': 'team_1_rating'}).drop('team', axis=1) # 匹配team2评分 df = df.merge( rating_total, left_on=['date', 'team_2'], right_on=['date', 'team'], how='left' ).rename(columns={'rating': 'team_2_rating'}).drop('team', axis=1) print(df)
输出结果
date team_1 team_1_rating team_2 team_2_rating 0 2021-11-01 horses 15 eagles 20 1 2021-11-02 horses 35 eagles 50
内容的提问来源于stack exchange,提问作者mayala1925
相关产品推荐
相关产品推荐

