Групповой: Панды Сплит-Аппли-Комбинат - PullRequest
1 голос
/ 31 мая 2019

Вот вид спорта где,

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()

Затем добавьте новую среднюю цель по столбцам строки (для дома / в гостях) в df. Вот как я пытался,

Сначала я создал новый счетчик строк для ID в df и a, b and c следующим образом,

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

и

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

Затем создайте новые столбцы с суммой строк для каждого идентификатора и в конечном итоге получите столбцы 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- Даже после создания столбцов Avg для a, b и c, я все еще не мог соединить его с исходным 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

1 Ответ

0 голосов
/ 31 мая 2019

Сначала создайте дополнительный ключ, используя cumcount и cut, затем у вас есть два ключа для groupby

df['NewKey']=pd.cut(df.groupby('ID').cumcount(),[-1,2,5,np.inf])
df.groupby(['ID','NewKey']).apply(yourfunc here)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...