【问题标题】:Pandas merge dataframes with multiple columnsPandas 将数据框与多列合并
【发布时间】:2022-01-04 14:34:37
【问题描述】:

我正在尝试合并 2 个数据帧,但在弄清楚如何合并时遇到了问题,因为它不是直截了当的。 一个数据框有超过 25000 场比赛的匹配结果,看起来像这样。 第二个具有团队绩效指标,但仅适用于大约 1500 场比赛。 由于我还不能发布图片,这里是感兴趣的列名:

df_match['date', 'home_team_api_id', 'away_team_api_id']
df_team_attributes['date', 'team_api_id']

两个数据框都有额外的列,其中包含结果或性能指标。 为了能够正确合并,我需要按日期合并,并查看“team_api_id”是否匹配“home...”或“away_team_api_id”

这是我到目前为止所尝试的:

df_team_performance = pd.merge(df_team_attributes, df_match,
                               how = 'left',
                               left_on = ['date', 'team_api_id', 'team_api_id'],
                               right_on = ['date', 'home_team_api_id', 'home_team_api_id'])

我也尝试过只有 2 列,但没有成功。 我想要得到的是一个新的数据框,其中只有 df_team_attributes 的行和两个数据框的列。 提前谢谢!

根据 Correlien 的要求添加: print(df_match[['date', 'home_team_api_id', 'away_team_api_id', 'win_home', 'win_away', 'draw', 'win']].head(10).to_dict()) 的输出 {'日期':{0:'2008-08-17 00:00:00',1:'2008-08-16 00:00:00',2:'2008-08-16 00:00:00' , 3: '2008-08-17 00:00:00', 4: '2008-08-16 00:00:00', 5: '2008-09-24 00:00:00', 6: '2008 -08-16 00:00:00',7:'2008-08-16 00:00:00',8:'2008-08-16 00:00:00',9:'2008-11-01 00 :00:00'}, 'home_team_api_id': {0: 9987, 1: 10000, 2: 9984, 3: 9991, 4: 7947, 5: 8203, 6: 9999, 7: 4049, 8: 10001, 9: 8342}, 'away_team_api_id': {0: 9993, 1: 9994, 2: 8635, 3: 9998, 4: 9985, 5: 8342, 6: 8571, 7: 9996, 8: 9986, 9: 8571}, ' win_home':{0:0、1:0、2:0、3:1、4:0、5:0、6:0、7:0、8:1、9:1},'win_away':{ 0:0、1:0、2:1、3:0、4:1、5:0、6:0、7:1、8:0、9:0},'画':{0:1, 1:1, 2:0, 3:0, 4:0, 5:1, 6:1, 7:0, 8:0, 9:0}, ‘win’: {0:0, 1:0, 2:1、3:1、4:1、5:0、6:0、7:1、8:1、9:1}}

print(df_team_attributes[['date', 'team_api_id', 'buildUpPlaySpeed', 'buildUpPlaySpeedClass']].head(10).to_dict()) 的输出 {'日期':{0:'2010-02-22 00:00:00',1:'2014-09-19 00:00:00',2:'2015-09-10 00:00:00' , 3: '2010-02-22 00:00:00', 4: '2011-02-22 00:00:00', 5: '2012-02-22 00:00:00', 6: '2013 -09-20 00:00:00',7:'2014-09-19 00:00:00',8:'2015-09-10 00:00:00',9:'2010-02-22 00 :00:00'}, 'team_api_id': {0: 9930, 1: 9930, 2: 9930, 3: 8485, 4: 8485, 5: 8485, 6: 8485, 7: 8485, 8: 8485, 9: 8576}, 'buildUpPlaySpeed': {0:60, 1:52, 2:47, 3:70, 4:47, 5:58, 6:62, 7:58, 8:59, 9:60}, ' buildUpPlaySpeedClass':{0:'平衡',1:'平衡',2:'平衡',3:'快速',4:'平衡',5:'平衡',6:'平衡',7:'平衡', 8: '平衡', 9: '平衡'}}

【问题讨论】:

  • 请使用print(df_match[['date', 'home_team_api_id', 'away_team_api_id']].head(10).to_dict())print(df_team_attributes[['date', 'team_api_id']].to_dict()) 的输出更新您的帖子,以便您的代码可重现。

标签: python pandas merge


【解决方案1】:

您是否尝试将日期列转换为正确的格式,然后尝试合并?根据您提供的示例,以下内容对我有用-

# Casting to date
df_match["date"] = pd.to_datetime(df_match["date"])
df_team_attributes["date"] = pd.to_datetime(df_match["date"])

# Merging on the date field alone
df_team_performance = pd.merge(df_team_attributes, df_match,
                               how = 'left',
                               on = 'date')

# Filtering out the required rows
result = df_team_performance.query("(team_api_id == home_team_api_id) | (team_api_id == away_team_api_id)")

如果我对您的问题的理解正确,请告诉我。

【讨论】:

  • 好吧,谢谢,它几乎可以完成这项工作。同时我做了转换日期,当我合并 2 个数据帧时,结果一个有 6800 行,因为我想在记录 team_attributes 的日期,有更多的匹配。但是,当我执行查询时,我只得到 50 行,这是不可能的。
  • 您的解决方案很好,谢谢。我对剩余的行数感到惊讶,但我已经手动尝试了其中的几个,这似乎是真的。谢谢!
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 2021-10-08
  • 2019-01-08
  • 2023-03-13
  • 2018-03-09
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
相关资源
最近更新 更多