【问题标题】:Joining 3 separate DataFrames based off 3 common column values in Pandas根据 Pandas 中的 3 个常见列值连接 3 个单独的 DataFrame
【发布时间】:2020-05-11 03:16:14
【问题描述】:

使用包含 2019 赛季第 1 周所有进攻球员统计数据的 NFL 数据集。我目前有三个 DataFrame,一个用于传递统计数据,一个用于快速统计数据和一个接收统计数据。我想将所有三个 DataFrame 组合成一个最终的 DataFrame。问题是一些玩家出现在一个或多个 DataFrame 中。例如,QB 可以跑动和传球,因此一些 QB 会同时出现在传球 DF 和冲球 DF 中。 “玩家”是我想要将它们组合起来的通用索引,但每个重复的行也将具有共同的“Pos”和“Tm”值。所以我想在'Player'、'Tm'和'Pos'列上组合这三个DataFrame。

我目前将每个 DataFrame 保存到名为 dfs 的列表中的一个变量中。

我试过了

df = dfs[0].join(dfs[1:])

但这导致给了我一个只有一行的 DataFrame - Julian Edelman - 唯一一个在 2019 赛季第 1 周跑动、传球和接球的球员。我只想说这不是我想要的。

下面复制的是每个 DataFrame 的前五行。

                Pos   Tm PassingYds PassingTD Int PassingAtt Cmp
Player
Lamar Jackson    QB  BAL        324         5   0         20  17
Dak Prescott     QB  DAL        405         4   0         32  25
Robert Griffin   QB  BAL         55         1   0          6   6
Patrick Mahomes  QB  KAN        378         3   0         33  25
Kirk Cousins     QB  MIN         98         1   0         10   8

--------------------------------------------------------------------------
               Pos   Tm Rec Tgt ReceivingYds ReceivingTD
Player
Sammy Watkins   WR  KAN   9  11          198           3
Michael Gallup  WR  DAL   7   7          158           0
John Ross       WR  CIN   7  12          158           2
DeSean Jackson  WR  PHI   8   9          154           2
Marquise Brown  WR  BAL   4   5          147           2
---------------------------------------------------------------------------
                    Pos   Tm RushingAtt RushingYds RushingTD
Player
Marlon Mack          RB  IND         25        174         1
Christian McCaffrey  RB  CAR         19        128         2
Saquon Barkley       RB  NYG         11        120         0
Dalvin Cook          RB  MIN         21        111         2
Mark Ingram          RB  BAL         14        107         2

【问题讨论】:

标签: python pandas dataframe merge inner-join


【解决方案1】:

您正在寻找以PlayerPosTm 作为索引的外连接。首先,将这些附加到您的索引中,然后使用 outer 的连接类型调用您当前的尝试


dfs = [d.set_index(['Pos', 'Tm'], append=True) for d in dfs]
dfs[0].join(dfs[1:], how='outer')

                             PassingYds  PassingTD  Int  PassingAtt   Cmp  Rec   Tgt  ReceivingYds  ReceivingTD  RushingAtt  RushingYds  RushingTD
Player              Pos Tm
Christian McCaffrey RB  CAR         NaN        NaN  NaN         NaN   NaN  NaN   NaN           NaN          NaN        19.0       128.0        2.0
Dak Prescott        QB  DAL       405.0        4.0  0.0        32.0  25.0  NaN   NaN           NaN          NaN         NaN         NaN        NaN
Dalvin Cook         RB  MIN         NaN        NaN  NaN         NaN   NaN  NaN   NaN           NaN          NaN        21.0       111.0        2.0
DeSean Jackson      WR  PHI         NaN        NaN  NaN         NaN   NaN  8.0   9.0         154.0          2.0         NaN         NaN        NaN
John Ross           WR  CIN         NaN        NaN  NaN         NaN   NaN  7.0  12.0         158.0          2.0         NaN         NaN        NaN
Kirk Cousins        QB  MIN        98.0        1.0  0.0        10.0   8.0  NaN   NaN           NaN          NaN         NaN         NaN        NaN
Lamar Jackson       QB  BAL       324.0        5.0  0.0        20.0  17.0  NaN   NaN           NaN          NaN         NaN         NaN        NaN
Mark Ingram         RB  BAL         NaN        NaN  NaN         NaN   NaN  NaN   NaN           NaN          NaN        14.0       107.0        2.0
Marlon Mack         RB  IND         NaN        NaN  NaN         NaN   NaN  NaN   NaN           NaN          NaN        25.0       174.0        1.0
Marquise Brown      WR  BAL         NaN        NaN  NaN         NaN   NaN  4.0   5.0         147.0          2.0         NaN         NaN        NaN
Michael Gallup      WR  DAL         NaN        NaN  NaN         NaN   NaN  7.0   7.0         158.0          0.0         NaN         NaN        NaN
Patrick Mahomes     QB  KAN       378.0        3.0  0.0        33.0  25.0  NaN   NaN           NaN          NaN         NaN         NaN        NaN
Robert Griffin      QB  BAL        55.0        1.0  0.0         6.0   6.0  NaN   NaN           NaN          NaN         NaN         NaN        NaN
Sammy Watkins       WR  KAN         NaN        NaN  NaN         NaN   NaN  9.0  11.0         198.0          3.0         NaN         NaN        NaN
Saquon Barkley      RB  NYG         NaN        NaN  NaN         NaN   NaN  NaN   NaN           NaN          NaN        11.0       120.0        0.0

【讨论】:

  • 我很困惑为什么你不想保留交叉点。如果一名球员既有传球数据又有跑动数据,您会希望该球员所在的行反映所有数据。
  • 不,相反,我想保留交叉点。这就是为什么我要确保我理解outer join 的行为,确保它也保留交叉点,而不是只保留外侧。
【解决方案2】:

最好将以下这些数据转换为.CSV格式,然后合并数据,以后可以数据框的形式导入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2012-10-15
    • 2019-10-03
    • 2022-01-20
    相关资源
    最近更新 更多