【发布时间】:2019-05-31 14:25:18
【问题描述】:
这是一个运动df,
ID 是匹配 ID(此处为 3 个数学)
HG 和 AG 主客场进球数
Period是比赛的舞台,第一节,第二节,...
d = {'ID':[121,121,121,121,121,121,343,343,343,343,343,343,343,343,678,678,678,678,678,678,678], 'Period':['1Q','1Q','2Q','2Q','3Q','3Q','1Q','1Q','2Q','2Q',
'3Q','3Q','4Q','4Q','1Q','1Q','2Q','2Q','3Q','3Q','2Q'],'HG':[0,1,2,3,3,3,0,0,1,2,3,4,4,5,0,1,2,2,3,4,5],
'AG':[0,0,1,2,2,3,0,1,1,2,3,3,4,4,1,2,2,2,3,3,4]}
df = pd.DataFrame(d)
我想通过简单地取任一球队在选定时间段内的平均进球数来研究在 df 的切片部分内进球的轨迹。
所以我按行索引拆分 df 并在其上应用一些函数。
让,
a = df.groupby("ID", group_keys=False).apply(lambda g: g.iloc[:2]).reset_index(drop=True)
b = df.groupby("ID", group_keys=False).apply(lambda g: g.iloc[2:5]).reset_index(drop=True)
c = df.groupby("ID", group_keys=False).apply(lambda g: g.iloc[5:]).reset_index(drop=True)
为了计算每场比赛中每行的平均目标(行是一些相等且固定的时间间隔),其中比赛的长度不同,我必须对行求和,然后除以所有df.ID.nunique()。
def Goal_Avg(data):
for i, row in data.iterrows():
return data.loc[:, ['HG','AG']].sum()
然后将新的每行列的平均目标(对于 Home/Away)附加到 df。 这是我的尝试,
首先,我在df 和a, b and c 中为ID 创建了一个新的行数,如下所示,
a['idx'] = a.groupby(['ID']).cumcount()
和
df['IDX'] = a.groupby(['ID']).cumcount()
然后,为每个 ID 创建具有行总和的新列,并最终为每个匹配获得所需的 HG_Avg 和 AG_Avg 列。对于相同大小的匹配,这将是相同的。
a_sum = a[['HG','AG']].groupby(a['idx']).apply(g_per)
a_sum.rename(columns={'HG':'HG_sum','AG':'AG_sum'}, inplace=True)
a_sum['HG_Avg'] = a_sum['HG_Sum'] / df.ID.nunique()
a_sum['AG_Avg'] = a_sum['AG_Sum'] / df.ID.nunique()
我的问题是
1- 即使在为 a、b 和 c 创建了 Avg 列之后,我仍然无法将其连接到原始 df。
2- 上面的方法看起来非常费力。请注意,我的数据包含的匹配项远不止 3 个。
这是最终输出
AG HG ID Period HG_Avg AG_Avg IDX
0 0 0 121 1Q 0.000 0.333 0
1 0 1 121 1Q 0.667 1.000 1
2 1 2 121 2Q 1.667 1.333 2
3 2 3 121 2Q 2.333 2.000 3
4 2 3 121 3Q 3.000 2.667 4
5 3 3 121 3Q 3.667 3.000 5
6 0 0 343 1Q 0.000 0.333 0
7 1 0 343 1Q 0.667 1.000 1
8 1 1 343 2Q 1.667 1.333 2
9 2 2 343 2Q 2.333 2.000 3
10 3 3 343 3Q 3.000 2.667 4
11 3 4 343 3Q 3.667 3.000 5
12 4 4 343 4Q 3.000 2.667 6
13 4 5 343 4Q 1.667 1.333 7
14 1 0 678 1Q 0.000 0.333 0
15 2 1 678 1Q 0.667 1.000 1
16 2 2 678 2Q 1.667 1.333 2
17 2 2 678 2Q 2.333 2.000 3
18 3 3 678 3Q 3.000 2.667 4
19 3 4 678 3Q 3.667 3.000 5
20 4 5 678 2Q 3.000 2.667 6
【问题讨论】:
-
为什么需要拆分?
-
@WeNYoBen,我正在研究给定时间间隔内进球的性质。