如何将 3 个 Pandas 数据帧合并到第 4 个数据帧以匹配列值名称?
Posted
技术标签:
【中文标题】如何将 3 个 Pandas 数据帧合并到第 4 个数据帧以匹配列值名称?【英文标题】:How to Merge 3 Pandas DataFrames to a 4th DataFrame to match column value Name? 【发布时间】: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])
【问题讨论】:
【参考方案1】: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
【讨论】:
非常感谢@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 先生!非常感谢您花时间提供帮助。 =)以上是关于如何将 3 个 Pandas 数据帧合并到第 4 个数据帧以匹配列值名称?的主要内容,如果未能解决你的问题,请参考以下文章
Pandas:如何将两个不完整的数据帧合并或合并为一个完整的数据帧
Python pandas:合并两个没有键的表(将 2 个数据帧与广播所有元素相乘;NxN 数据帧)
当我合并两个数据帧时,如何防止 Pandas 将我的整数转换为浮点数?