熊猫-合并为两行

时间:2020-10-08 18:09:24

标签: python pandas

我有一个类似的df,其中home_dummy 0是“ Away”的二进制文件,而1是“ home”的二进制文件。

  1. 如果球队的得分为1(G),则为1(主场)。

  2. 如果团队在0得分0'G',那么在0得分'0'。

我展示了一个示例,但还有许多其他匹配项。

            team       opponent   home_dummy  G
0     Athlético-PR       Flamengo          0  1
...
20    Athlético-PR       Flamengo          1  0
...
190       Flamengo   Athlético-PR          0  3
...
121       Flamengo   Athlético-PR          1  2

我如何最终得到一个仅在两行中表示比赛结果(进球数与进球数)的表,如下所示:

            team        opponent   HomeG AwayG
...
0       Flamengo   Athlético-PR     2     1
1       Athlético-PR   Flamengo     0     3

注意:

在常规比赛中,各队面对面两次,每场一次主场比赛,一次客场比赛。

1 个答案:

答案 0 :(得分:1)

这是一种方法。首先,将原始数据转换为数据帧:

from io import StringIO
import pandas as pd

data = '''            team       opponent   home_dummy  G
0     Athlético-PR       Flamengo          0  1
20    Athlético-PR       Flamengo          1  0
190       Flamengo   Athlético-PR          0  3
121       Flamengo   Athlético-PR          1  2
'''
df = pd.read_csv(StringIO(data), sep='\s\s+', engine='python')

现在创建家庭和外出数据框,然后将它们加入:

t_home = (df.loc[ df['home_dummy'] == 1, ['team', 'opponent', 'G']]
          .rename(columns={'G': 'HomeG'})
          .copy())

# reverse team and opponent
t_away = (df.loc[ df['home_dummy'] == 0, ['team', 'opponent', 'G']]
          .rename(columns={'G': 'AwayG', 'team': 'opponent', 'opponent': 'team'})
          .copy())

result = (pd.merge(t_home, t_away, how='inner', 
                   left_on=['team', 'opponent'], right_on=['team', 'opponent']))
print(result)

           team      opponent  HomeG  AwayG
0  Athlético-PR      Flamengo      0      3
1      Flamengo  Athlético-PR      2      1

排序顺序与预期答案不同;不确定是否相关。