【问题标题】:How to Merge 3 Pandas DataFrames to a 4th DataFrame to match column value Name?如何将 3 个 Pandas 数据帧合并到第 4 个数据帧以匹配列值名称?
【发布时间】:2021-12-08 18:17:21
【问题描述】:

我有一个名为 nflLineups 的主 DataFrame。

我希望再合并 3 个 DataFrame:dfPass、dfRush、dfReceive 与第一个 DF、nflLineups。

到目前为止,我尝试过的任何方法都没有奏效。尝试了追加、连接和合并——合并 how='left'、how='outer'、on = 'Name' 等。

我的目标是有一个大型输出来合并 Name 上的数据,但保留所有列及其各自的值。

主要输出应具有以下列:姓名、团队、职位、passYrds、rushYrds、recYrds。我只想将统计数据(pass、rush、rec)填写在 nflLineups 中球员姓名旁边的各自行中。并非每个玩家都有每个类别的数据,因此这些值应留空(不适用)。

我看到 Stack 上有一些合并示例,但还没有找到可以成功使用的代码。在过去的 2 天里一直在处理这个问题,如果可能的话可以使用一些帮助。仍在学习如何合并数据,并认为自己是 Python 新手。

任何帮助将不胜感激。

到目前为止,这是我的代码:

import pandas as pd

nflLineups = pd.DataFrame([{'Name': 'Teddy', 'Team': 'DEN', 'Position': 'QB'},
                        {'Name': 'Melvin', 'Team': 'DEN', 'Position': 'RB'},
                        {'Name': 'Courtland', 'Team': 'DEN', 'Position': 'WR'},
                        {'Name': 'Tim', 'Team': 'DEN', 'Position': 'WR'},
                        {'Name': 'Kendal', 'Team': 'DEN', 'Position': 'WR'},
                        {'Name': 'Noah', 'Team': 'DEN', 'Position': 'TE'},
                        
                        {'Name': 'Case', 'Team': 'CLE', 'Position': 'QB'},
                        {'Name': 'D Ernest', 'Team': 'CLE', 'Position': 'RB'},
                        {'Name': 'Odell', 'Team': 'CLE', 'Position': 'WR'},
                        {'Name': 'Jarvis', 'Team': 'CLE', 'Position': 'WR'},
                        {'Name': 'Donovan', 'Team': 'CLE', 'Position': 'WR'},
                        {'Name': 'Austin', 'Team': 'CLE', 'Position': 'TE'},])


dfPass = pd.DataFrame([{'Name': 'Teddy', 'Team': 'DEN', 'Position': 'QB', 'passYrds': 1500},
                        {'Name': 'Case', 'Team': 'CLE', 'Position': 'QB', 'passYrds': 1350}])


dfRun = pd.DataFrame([{'Name': 'Teddy', 'Team': 'DEN', 'Position': 'QB', 'rushYrds': 45},
                        {'Name': 'D Ernest', 'Team': 'CLE', 'Position': 'RB', 'rushYrds': 350}])


dfReceive = pd.DataFrame([{'Name': 'D Ernest', 'Team': 'CLE', 'Position': 'RB', 'recYrds': 68},
                        {'Name': 'Jarvis', 'Team': 'CLE', 'Position': 'WR', 'recYrds': 250}])

【问题讨论】:

    标签: python pandas dataframe merge concatenation


    【解决方案1】:

    IIUC,在pandas.concat 之后使用pandas.DataFrame.groupby.first 的一种方式。

    请注意,我假设 TeamPosition 对于每个 Name 都是相同的。

    df = pd.concat([nflLineups, dfPass, dfRun, dfReceive])
    df = df.groupby("Name", sort=False).first()
    

    输出:

              Team Position  passYrds  rushYrds  recYrds
    Name                                                
    Teddy      DEN       QB    1500.0      45.0      NaN
    Melvin     DEN       RB       NaN       NaN      NaN
    Courtland  DEN       WR       NaN       NaN      NaN
    Tim        DEN       WR       NaN       NaN      NaN
    Kendal     DEN       WR       NaN       NaN      NaN
    Noah       DEN       TE       NaN       NaN      NaN
    Case       CLE       QB    1350.0       NaN      NaN
    D Ernest   CLE       RB       NaN     350.0     68.0
    Odell      CLE       WR       NaN       NaN      NaN
    Jarvis     CLE       WR       NaN       NaN    250.0
    Donovan    CLE       WR       NaN       NaN      NaN
    Austin     CLE       TE       NaN       NaN      NaN
    

    【讨论】:

    • 非常感谢@Chris!这给了我很多问题。非常感谢您的时间和帮助。 =)
    • 这段代码效果很好,先生!有什么方法可以保持 nflLineups DF 的顺序吗?美丽的!了不起的工作!
    • @AbleArcher 您可以将sort = False 传递给groupby。查看我的编辑;)
    【解决方案2】:

    或者合并:

    df_main = nflLineups.merge(dfPass, how='left', on=['Name', 'Team', 'Position']).merge(dfRun, how='left', on=['Name', 'Team', 'Position']).merge(dfReceive, how='left', on=['Name', 'Team', 'Position'])
    

    输出:

             Name Team Position  passYrds  rushYrds  recYrds
    0       Teddy  DEN       QB    1500.0      45.0      NaN
    1      Melvin  DEN       RB       NaN       NaN      NaN
    2   Courtland  DEN       WR       NaN       NaN      NaN
    3         Tim  DEN       WR       NaN       NaN      NaN
    4      Kendal  DEN       WR       NaN       NaN      NaN
    5        Noah  DEN       TE       NaN       NaN      NaN
    6        Case  CLE       QB    1350.0       NaN      NaN
    7    D Ernest  CLE       RB       NaN     350.0     68.0
    8       Odell  CLE       WR       NaN       NaN      NaN
    9      Jarvis  CLE       WR       NaN       NaN    250.0
    10    Donovan  CLE       WR       NaN       NaN      NaN
    11     Austin  CLE       TE       NaN       NaN      NaN
    

    【讨论】:

    • 非常感谢@Muhammad Hassan 先生!非常感谢您花时间提供帮助。 =)
    猜你喜欢
    • 2021-03-10
    • 1970-01-01
    • 2020-10-09
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多