Существует ли функция pandas для суммирования заданного количества предыдущих элементов строки в кадре данных? - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь создать функцию, которая может просматривать предыдущие строки в DataFrame и суммировать их на основе заданного количества строк для просмотра. Здесь я использовал 3, но в идеале я хотел бы увеличить его, чтобы оглянуться назад на большее количество строк. Мое решение работает, но, похоже, не очень эффективно. Другой критерий - каждый раз, когда он попадает в новую команду, счетчик должен начинаться заново, поэтому первая строка для каждой новой команды всегда равна 0, данные будут упорядочены в командном порядке, но если известно решение, для которого данные нев командном порядке это было бы невероятно. Есть ли в Пандах функция, которая может помочь с этим?

До сих пор я пробовал приведенный ниже код и пытался найти проблему, самый близкий пример, который я смог найти: здесь ! но это группирует индекс, и я не уверен, как применить это, когда значение должно постоянно сбрасываться каждый раз, когда оно попадает в новую команду, поскольку это не будет различать каждый раз, когда появляется новая команда.

np.random.seed(0)
data = {'team':['a','a','a','a','a','a','a','a','b','b',
    'b','b','b','b','b','b','c','c','c','c','c','c','c','c'], 
    'teamPoints': np.random.randint(0,4,24)}

df = pd.DataFrame.from_dict(data)
df.reset_index(inplace=True)


def find_sum_last_3(x):
    if x == 0:
        return 0
    elif x == 1:
        return df['teamPoints'][x-1]
    elif x == 2:
        return df['teamPoints'][x-1] + df['teamPoints'][x-2]



    elif df['team'][x] != df['team'][x-1]:
        return 0
    elif df['team'][x] != df['team'][x-2]:
        return df['teamPoints'][x-1]
    elif df['team'][x] != df['team'][x-3]:
        return df['teamPoints'][x-1] + df['teamPoints'][x-2]


    else:
        return df['teamPoints'][x-1] + df['teamPoints'][x-2] + 
df['teamPoints'][x-3]

df['team_form_3games'] = df['index'].apply(lambda x : find_sum_last_3(x))

Первая часть функции обращается к крайним случаям, когда сумма 3 невозможна, потому что есть менее 3 элементов

Вторая часть функции решает проблему 'командыменяетсяКогда команда меняет сумму, ее нужно начинать заново, поэтому каждая «команда» рассматривается отдельно

В заключительной части просто рассматриваются предыдущие 3 элемента dataFrame и суммируются их вместе.

Этопример работает как ожидалось и дает новый столбец с ожидаемым выводом следующим образом:

0, 0, 3, 4, 4, 4, 6, 9, 0, 1, 4, 5, 6, 3, 5, 5, 0, 0, 0, 2, 3, 5, 6, 8

1-й элемент равен 0, так как это крайний случай, 2-й равен 0, потому что сумма первого элемента равна 0. 3-й равен 3так как сумма 1-го и 2-го элементов равна 3. 4-я сумма 1-го, 2-го, 3-го. 5-я сумма 2-го, 3-го, 4-го. 6-е - это сумма 3-го, 4-го, 5-го

Однако, когда масштабируется до 10, он оказывается очень неэффективным, что затрудняет масштабирование до 10 или 15. Он также неэлегатен, и новая функция должнабыть написано для каждой различной длины суммы.

1 Ответ

1 голос
/ 08 октября 2019

Я думаю, что вы ищете GroupBy.apply + rolling:

r3=df.groupby('team')['teamPoints'].apply(lambda x: x.rolling(3).sum().shift())
r2=df.groupby('team')['teamPoints'].apply(lambda x: x.rolling(2).sum().shift())
r1=df.groupby('team')['teamPoints'].apply(lambda x: x.shift())
df['team_form_3games'] = r3.fillna(r2.fillna(r1).fillna(0))
print(df)

Вывод:

    index team  teamPoints  team_form_3games
0       0    a           0               0.0
1       1    a           3               0.0
2       2    a           1               3.0
3       3    a           0               4.0
4       4    a           3               4.0
5       5    a           3               4.0
6       6    a           3               6.0
7       7    a           3               9.0
8       8    b           1               0.0
9       9    b           3               1.0
10     10    b           1               4.0
11     11    b           2               5.0
12     12    b           0               6.0
13     13    b           3               3.0
14     14    b           2               5.0
15     15    b           0               5.0
16     16    c           0               0.0
17     17    c           0               0.0
18     18    c           2               0.0
19     19    c           1               2.0
20     20    c           2               3.0
21     21    c           3               5.0
22     22    c           3               6.0
23     23    c           2               8.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...