如何将 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 的一种方式。

请注意,我假设 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 先生!非常感谢您花时间提供帮助。 =)

以上是关于如何将 3 个 Pandas 数据帧合并到第 4 个数据帧以匹配列值名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何基于多个条件更快地合并 2 个 pandas 数据帧

Pandas:如何将两个不完整的数据帧合并或合并为一个完整的数据帧

Python pandas:合并两个没有键的表(将 2 个数据帧与广播所有元素相乘;NxN 数据帧)

当我合并两个数据帧时,如何防止 Pandas 将我的整数转换为浮点数?

在 Python 中使用 Pandas 合并时间序列数据帧及其集体附加注释

在 Python 中合并 Pandas 数据帧