Pandas把两排放在一起

2024-06-02 07:57:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像这样的df,其中home_dummy0是一个二进制,表示“离开”,1表示“回家”

  1. 如果该队在1分时得了1分“G”,那么它就得了1分“主场”

  2. 如果该队在0分时得分为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

注:

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


Tags: dfhome二进制prteam例子dummy回家
1条回答
网友
1楼 · 发布于 2024-06-02 07:57:40

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

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

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

相关问题 更多 >