代码之家  ›  专栏  ›  技术社区  ›  8-Bit Borges

Pandas—连接两个数据帧并在新列上添加列值

  •  0
  • 8-Bit Borges  · 技术社区  · 5 年前

    我有两个数据帧, home :

       home_team_api_id  home_points
    0                262           37
    1                263           14
    2                264           31
    3                265           29
    4                266           38
    5                267           26
    6                275           35
    7                276           37
    8                277           34
    9                280           35
    10               282           46
    11               284           36
    12               285           41
    13               290           23
    14               292           26
    15               293           32
    16               294           18
    17               354           26
    18               356           30
    19               373           27
    

    away :

    away_team_api_id  away_points
    0               262           34
    1               263           13
    2               264           20
    3               265           15
    4               266           26
    5               267           15
    6               275           23
    7               276           29
    8               277           20
    9               280           18
    10              282           22
    11              284           23
    12              285           29
    13              290           14
    14              292           16
    15              293           21
    16              294           13
    17              354           26
    18              356           11
    19              373           23
    

    我试图创建一个“排名”数据框,在这里我为所有球队添加主客场积分,并得到一个“总积分”列,如下所示:

        rank = away.set_index('away_team_api_id').join(home.set_index('home_team_api_id'))
        rank['total_point'] = rank['away_points'] + rank['home_points']
    

    但我得到了:

                      away_points  home_points  total_point
    away_team_api_id                                       
    262                        34          NaN          NaN
    263                        13          NaN          NaN
    264                        20          NaN          NaN
    265                        15          NaN          NaN
    266                        26          NaN          NaN
    267                        15          NaN          NaN
    275                        23          NaN          NaN
    276                        29          NaN          NaN
    277                        20          NaN          NaN
    280                        18          NaN          NaN
    282                        22          NaN          NaN
    284                        23          NaN          NaN
    285                        29          NaN          NaN
    290                        14          NaN          NaN
    292                        16          NaN          NaN
    293                        21          NaN          NaN
    294                        13          NaN          NaN
    354                        26          NaN          NaN
    356                        11          NaN          NaN
    373                        23          NaN          NaN
    

    我错过了什么?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Corralien    5 年前
    rank = pd.merge(home.set_index("home_team_api_id").rename_axis("team_api_id"),
                    away.set_index("away_team_api_id").rename_axis("team_api_id"),
                    on="team_api_id")
    
    rank["total_points"] = rank["home_points"] + rank["away_points"]
    
    >>> rank
                 home_points  away_points  total_points
    team_api_id
    262                   37           34            71
    263                   14           13            27
    264                   31           20            51
    265                   29           15            44
    266                   38           26            64
    267                   26           15            41
    275                   35           23            58
    276                   37           29            66
    277                   34           20            54
    280                   35           18            53
    282                   46           22            68
    284                   36           23            59
    285                   41           29            70
    290                   23           14            37
    292                   26           16            42
    293                   32           21            53
    294                   18           13            31
    354                   26           26            52
    356                   30           11            41
    373                   27           23            50
    

    奖金 :排名

    rank["rank"] = rank["total_points"].rank(method="max", ascending=False).astype(int)
    
    >>> rank.sort_values("rank")
                 home_points  away_points  total_points  rank
    team_api_id
    262                   37           34            71     1
    285                   41           29            70     2
    282                   46           22            68     3
    276                   37           29            66     4
    266                   38           26            64     5
    284                   36           23            59     6
    275                   35           23            58     7
    277                   34           20            54     8
    293                   32           21            53    10
    280                   35           18            53    10
    354                   26           26            52    11
    264                   31           20            51    12
    373                   27           23            50    13
    265                   29           15            44    14
    292                   26           16            42    15
    267                   26           15            41    17
    356                   30           11            41    17
    290                   23           14            37    18
    294                   18           13            31    19
    263                   14           13            27    20