Создать буфер в кадре данных на основе нескольких столбцов - Python - PullRequest
1 голос
/ 06 апреля 2020

У меня есть фрейм данных

EGID    Start_date     End_Date    Consumption    Number_day

  1      2019-01-01    2019-05-28       30        152
  1      2019-06-05    2019-07-31       40        60
  1      2019-08-01    2019-09-31       40        0
  1      2019-02-11    2019-04-14       60        60 
  2      2019-02-11    2019-04-14       60        60 
  2      2019-08-01    2019-09-31       40        200
  3      2019-01-01    2019-05-28       30        200
  3      2019-06-05    2019-07-31       40        150
  3      2019-08-01    2019-09-31       40        60
  3      2019-09-31    2019-12-31       50        60

Ожидаемый результат:

EGID    Start_date     End_Date    Consumption    Number_day

  1      2019-01-01    2019-07-31       70        212
  1      2019-08-01    2019-09-31       40        0
  1      2019-02-11    2019-04-14       60        60 
  2      2019-02-11    2019-09-31       100       260
  3      2019-01-01    2019-07-31       70        350
  3      2019-08-01    2019-12-31       90        120

Я хотел бы суммировать потребление и количество дней, если это один и тот же EGID (строка). Однако, если строка числа дней больше 350 или равна 0, то она должна прекратить суммирование (даже если это тот же EGID - см. EGID 1). Затем, если сумма суммы число_дней превышает 350, то она должна прекратить суммирование (см. EGID 3). Наконец, конечной датой строки должна быть последняя сумма, которая была суммирована.

Кто-то помог мне, и мы сделали это, но, к сожалению, сумма количества дней может быть выше 350, так как она суммировала все с одинаковым EGID.

df['Consumption2'] = (df['Number_day'] < 350) * df['Consumption']  
df['Number_day2'] = (df['Number_day'] < 350) * df['Number_day']
df.groupby(['EGID'])[['Start_date', 'End_Date', 'Consumption2', 'Number_day2']].agg({'Start_date':'min', 'End_Date':'max', 'Consumption2':'sum', 'Number_day2':'sum'})

Спасибо за помощь.

1 Ответ

1 голос
/ 06 апреля 2020

Попробуйте, и если результаты не являются желаемыми, пожалуйста, измените текущий вопрос, чтобы включить эти случаи в соответствие с желаемым результатом.

import pandas as pd #import library

# i am assuming that your dataframe name is df
df = pd.DataFrame({'EGID':['1', '1', '1', '1', '2', '2', '3', '3', '3', '3'], 
             'Start_date':['2019-01-01', '2019-06-05', '2019-08-01', '2019-02-11', '2019-02-11',
                          '2019-08-01', '2019-01-01', '2019-06-05', '2019-08-01', '2019-09-31'],
             'End_Date':['2019-05-28', '2019-07-31', '2019-09-31', '2019-04-14', '2019-04-14',
                        '2019-09-31', '2019-05-28', '2019-07-31', '2019-09-31', '2019-12-31'], 
             'Consumption':[30, 40, 40, 60, 60, 40, 30, 40, 40, 50], 
             'Number_day':[152, 60, 0, 60, 60, 200, 200, 150, 60, 60]})


def counter_limits(x, lower_limit = 0, upper_limit=350):
    """
    Function that takes a list or pandas series and returns a list integers that increment 
    when cumulative sum is reached or the element is the lower limit
    """
    result = []
    cummulative = 0
    counter = 0
    prev_el = -1
    for el in x:
        cummulative += el
        if (cummulative > upper_limit) or (el == lower_limit) or (prev_el == lower_limit):
            counter += 1
            cummulative = 0
            result.append(counter)
        else:
            result.append(counter)
        prev_el = el
    return result

df['key'] = df.groupby(['EGID'])['Number_day'].transform(counter_limits)

df2 = pd.concat([
    df.groupby(['EGID', 'key'])[['Start_date', 'End_Date']].last(),
    df.groupby(['EGID', 'key'])[['Consumption', 'Number_day']].sum()
    ], axis=1).reset_index().drop(columns='key')

df2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...