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

如何将以日期为键、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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:36:03