0

我有一个非常具体的问题。

例如,我正在尝试分析一些历史足球数据,并希望为每支球队创建几列最近的主场和客场进球数。我试图在这里简化事情,让我们说df看起来像这样:

df = pd.DataFrame({'Home':['A','B','C','B','A','A','C'],'Away':['B','C','A','C','B','B','A'],
                   'HG':[1,2,3,2,1,4,1],'AG':[2,4,5,1,3,2,2]})
  Home Away  HG  AG
0    A    B   1   2
1    B    C   2   4
2    C    A   3   5
3    B    C   2   1
4    A    B   1   3
5    A    B   4   2
6    C    A   1   2

我想要做的是将 df 中每一行的 Home 和 Away 的最近两个目标数字(HG和/或)相加。AG但我显然不想考虑最近的一行。

因此,如果我们查看索引第 0 行。首页是“A”。我希望得到的数字是 6,来自 AG 下的索引第 2 行的 5 作为 A 是这一行的客队,而索引第 4 行的 1 作为 A 是主队,总共等于 6。对于索引行 0 中的客队 B,我希望结果为 4,从索引行 1 和索引行 3 开始。依此类推。np.NaN如果要计算的数据点少于 2 个,我也想返回。

我最初想可能写一个小函数来帮助做到这一点,类似于this但显然这是非常不正确的:

def get_rolling_sum(x):
    count_list = []
    new_df = df[(df['Home'] == str(x)) | (df['Away'] == str(x))]
    for i in range(0,len(new_df)):
        if new_df['Home'].iloc[i] == str(x):
            count_list.append(new_df['HG'].iloc[i])
        elif new_df['Away'].iloc[i] == str(x):
            count_list.append(new_df['AG'].iloc[i])
df['Roll_Home'] = [get_rolling_sum(x) for x in df['Home']]

我希望得到的是这样的:

  Home Away  HG  AG  Expected_Home
0    A    B   1   2            6.0
1    B    C   2   4            5.0
2    C    A   3   5            2.0
3    B    C   2   1            5.0
4    A    B   1   3            6.0
5    A    B   4   2            NaN
6    C    A   1   2            NaN

非常感谢

4

1 回答 1

2

首先让我们向数据框添加一列,以便行索引可用。然后创建一个堆叠数据框,使 Home 和 Away 列成为单列,HG 和 AG 列成为单列,同时保持索引不变。基本上,原始 df 的 Home 和 Away 值将变为两个连续的行。然后从参考索引大于原始索引的堆叠数据框中取出最近的两行并添加目标。(您必须手动将最后两行设为 NaN)。

df = pd.DataFrame({'Home':['A','B','C','B','A','A','C'],'Away':['B','C','A','C','B','B','A'],
               'HG':[1,2,3,2,1,4,1],'AG':[2,4,5,1,3,2,2]})[['Home', 'Away', 'HG', 'AG']]
df['ref_index'] = df.index

df_stack = pd.concat([df[['Home', 'HG']].rename(columns = {'Home':'Loc', 'HG':'Goals'}), 
                  df[['Away', 'AG']].rename(columns = {'Away':'Loc', 'AG':'Goals'})]).sort_index(kind='merge')
df_stack['ref_index'] = df_stack.index

df['Expected_Home'] = df.apply(lambda row: df_stack[(df_stack.Loc == row['Home']) & 
                                                (df_stack.ref_index > row['ref_index'])].iloc[:2].Goals.sum(),
                           axis = 1)

print(df)

     Home   Away    HG  AG  ref_index   Expected_Home
   0    A      B    1   2          0    6
   1    B      C    2   4          1    5
   2    C      A    3   5          2    2
   3    B      C    2   1          3    5
   4    A      B    1   3          4    6
   5    A      B    4   2          5    2
   6    C      A    1   2          6    0
于 2020-10-06T08:51:47.197 回答