如何将 3 Pandas DataFrame 合并到第 4 个 DataFrame 以匹配列值名称?

How to Merge 3 Pandas DataFrames to a 4th DataFrame to match column value Name?

我有一个名为 nflLineups 的主 DataFrame。

我希望将另外 3 个数据帧:dfPass、dfRush、dfReceive 与第一个 DF、nflLineups 合并。

到目前为止,我尝试过的都没有奏效。尝试附加、串联和合并——合并 how='left'、how='outer'、on = 'Name' 等

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

主要输出应包含以下列:Name、Team、Position、passYrds、rushYrds、recYrds。我只想将统计数据(传球、冲球、记录)填入 nflLineups 中球员姓名旁边的相应行。并非每个玩家都有每个类别的数据,因此这些值应留空 (n/a)。

我看到 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}])

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

或合并:

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