如何将 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
的方法
请注意,我假设 Team
和 Position
对于每个 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
我有一个名为 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
的方法
请注意,我假设 Team
和 Position
对于每个 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