【问题标题】:Groupby: Pandas Split-Apply-CombineGroupby:熊猫拆分应用组合
【发布时间】:2019-05-31 14:25:18
【问题描述】:

这是一个运动df,

ID 是匹配 ID(此处为 3 个数学)

HGAG 主客场进球数

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。 这是我的尝试,

首先,我在dfa, b and c 中为ID 创建了一个新的行数,如下所示,

a['idx'] = a.groupby(['ID']).cumcount()

df['IDX'] = a.groupby(['ID']).cumcount()

然后,为每个 ID 创建具有行总和的新列,并最终为每个匹配获得所需的 HG_AvgAG_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,我正在研究给定时间间隔内进球的性质。

标签: pandas merge concat


【解决方案1】:

首先使用 cumcountcut 创建附加密钥,然后您有两个用于 groupby 的密钥

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

【讨论】:

    猜你喜欢
    • 2023-01-12
    • 2020-05-28
    • 2022-06-10
    • 2019-02-24
    • 2023-02-25
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多