Pandas Groupby:熊猫分割应用联合收割机

Pandas Groupby:熊猫分割应用联合收割机,pandas,merge,concat,Pandas,Merge,Concat,这是一项体育运动 ID是匹配ID(这里有3个数学) HG和AG主客场进球得分 期间是游戏的阶段,第一季度、第二季度 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'

这是一项体育运动

ID
是匹配ID(这里有3个数学)

HG
AG
主客场进球得分

期间
是游戏的阶段,第一季度、第二季度

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,并在其上应用一些函数

让,

要计算每个匹配中每行的平均目标(行是一些相等且固定的时间间隔),如果匹配的长度不同,我必须将行相加,然后除以所有
df.ID.nunique()

然后将新的平均每行目标列(主场/客场)附加到df。 我是这样试的

首先,我在
df
a、b和c
中为
ID
创建了一个新的行计数,如下所示

a['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

首先使用
cumcount
cut
创建附加键,然后您有两个键用于
groupby

df['NewKey']=pd.cut(df.groupby('ID').cumcount(),[-1,2,5,np.inf])
df.groupby(['ID','NewKey']).apply(yourfunc here)

“你为什么需要分开?”温约本,我正在研究在给定时间间隔内进球的性质。
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()
    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
df['NewKey']=pd.cut(df.groupby('ID').cumcount(),[-1,2,5,np.inf])
df.groupby(['ID','NewKey']).apply(yourfunc here)