首页 > 解决方案 > 基于匹配列 pandas 组合行

问题描述

我有一个 csv 文件,其中包含每支球队整个赛季的比赛和统计数据。我想将客队与那周面对的主队移动到同一排。

当前数据框:

      Week   Team   H/a   Opp   Pf   Pa   Pyards  
      1      A            C     3    14   100     
      1      B            D     7    21   200     
      1      C      @     A     14   3    300     
      1      D      @     B     21   7    400     

所需的数据框:

  Week   HomeTeam   H-score   H-Pyards   AwayTeam   A-score   A-Pyards  
  1      A          3         100        C          14        300       
  1      B          7         200        D          21        400       

但是我会为每支球队和多周获得更多的统计数据。

标签: pythonpandasnumpydataframe

解决方案


我相信您正在寻找的操作是在self-join之后进行的一些操作。正如 Quang Hoang 所说,在不同的列中合并相同的数据框/表称为自连接。我相信这是一种获得预期输出的方法:

df = pd.DataFrame({'Week':[1,1,1,1],
                   'Team':['A','B','C','D'],
                   'H/a':[np.nan,np.nan,'@','@'],
                   'Opp':['C','D','A','B'],
                   'Pf':[3,7,14,21],
                   'Pa':[14,21,3,7],
                   'Pyards':[100,200,300,400]})
print(df)
new_df = df.merge(df,how='inner',left_on=['Week','Team'],right_on=['Week','Opp'])
new_df = new_df[new_df['H/a_x'] != '@']
replacers = {'Team_x':'HomeTeam','Pf_x':'Pf','Pyards_x':'H-Pyards','Opp_x':'AwayTeam','Pa_x':'A-score','Pyards_y':'A-Pyards'}
new_df = new_df[['Week']+[x for x in replacers.keys()]]
new_df = new_df.rename(columns=replacers)
print(new_df)

输出:

   Week HomeTeam  Pf  H-Pyards AwayTeam  A-score  A-Pyards
0     1        A   3       100        C       14       300
1     1        B   7       200        D       21       400

推荐阅读