Как суммировать определенные столбцы в строке, в зависимости от другого столбца? - PullRequest
0 голосов
/ 16 мая 2019

Не могли бы вы помочь мне решить следующую проблему:

Образец файла:

enter image description here

Я пытаюсь собрать сумму6 месяцев, по сравнению с определенной датой начала в строке.

Сумма должна быть указана в новом столбце (сумма 6 месяцев с даты начала)

Моя первая мысль будетполучить его с помощью следующего кода:

df['sum_6_months'] = df.loc[:,'01.2018':'06.2018'].apply(sum, axis=1)

но этот код не индивидуально и только для периода (01.18-06.18) во всех строках.

df = pd.DataFrame(np.array([[1, 5, 3, 4, 5, 6, 7, 7, 8,2,5,7,3,4,1], [1, 5, 3, 4, 5, 6, 7, 7,8,2,5,7,3,4,2],[1,5,3, 3, 4, 5, 6, 7, 7, 8,2,5,7,3,4],
                             [1, 5, 3, 4, 5, 6, 7, 7, 8,2,5,7,3,4,3], [1, 5, 3, 4, 5, 6, 7, 7,8,2,5,7,3,4,4],[1,5,5, 3, 4, 5, 6, 7, 7, 8,2,5,7,3,4],
                             [1, 5, 3, 4, 5, 6, 7, 7, 8,2,5,7,3,4,5], [1, 5, 3, 4, 5, 6, 7, 7,8,2,5,7,3,4,5],[1,5,2, 3, 4, 5, 6, 7, 7, 8,2,5,7,3,4],
                             [1, 5, 3, 4, 5, 6, 7, 7, 8,2,5,7,3,4,6], [1, 5, 3, 4, 5, 6, 7, 7,8,2,5,7,3,4,2],[1,5,5, 3, 4, 5, 6, 7, 7, 8,2,5,7,3,4],
                             [1, 5, 3, 4, 5, 6, 7, 7, 8,2,5,7,3,4,4], [1, 5, 3, 4, 5, 6, 7, 7,8,2,5,7,3,4,2],[1,5,1, 3, 4, 5, 6, 7, 7, 8,2,5,7,3,4]]),
                   columns=['01.2018', '02.2018', '03.2018', '04.2018', '05.2018','06.2018', '07.2018', '08.2018',
                            '09.2018','10.2018', '11.2018', '12.2018','01.2019', '02.2019', '03.2019'])

date = [01.2018, 03.2018,04.2018,05.2018,03.2018,01.2018, 03.2018,04.2018,05.2018,03.2018,01.2018, 03.2018,04.2018,05.2018,03.2018]
df['Startdate']= date

Ответы [ 2 ]

1 голос
/ 17 мая 2019
df['Startdate']=df['Startdate'].astype(str).str.rjust(7,'0')

df_columns = df.columns.tolist()
def get_sum_six(df_list):
    start_date_index = df_columns.index(df_list[-1])
    df_list = df_list[0:-1]
    sum_of_six = sum(df_list[start_date_index: start_date_index + min(len(df_list)-start_date_index, 6)])
    return (sum_of_six)

df['sum_last_six'] = df.apply(lambda x: get_sum_six(x.tolist()), axis=1)
1 голос
/ 16 мая 2019

Сначала вычислите количество пропущенных столбцов в каждой строке:

df2['StartCol'] = 1 + df2.columns[1:].searchsorted(df2.Startdate)

1: пропускает столбец Startdate. Затем «сверните» столько столбцов влево, чтобы они обернулись и оказались в конце каждого ряда, возьмите первые 6 и сложите:

np.roll(df2.iloc[:, 1:], -df2.StartCol)[:,:6].sum(1)

Это дает вам:

[27, 28, 27, 21, 26, 27, 29, 27, 21, 25, 27, 25, 25, 18, 23]

Который вы можете сохранить в новом столбце, если хотите.

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