Выполнение суммирования для нескольких столбцов на основе соответствующих значений индекса - PullRequest
0 голосов
/ 11 июля 2019

У меня есть фрейм данных, который в настоящее время выглядит следующим образом:

 df = pd.DataFrame(np.array([[1, 2, 'Apples 20pk ABC123', 4, 5], [6, 7, 
 'Bananas 20pk ABC123', 9, 0], [1, 2, 'Apples 20pk ABC123', 8, 9]]), 
 columns= ['Serial #', 'Branch ID', 'Info', 'Value1', 'Value2'])

               Serial#  Branch ID    Info                  Value1   Value2
        0         1       2          Apples 20pk ABC123       4        5
        1         6       7          Bananas 20pk ABC123      9        0
        2         1       2          Apples 20pk ABC123       8        9

Я хотел сгруппировать столбцы: Serial #, ID ветви и Info, чтобы получить совокупную сумму столбцов "value1" и "значение2" .По сути, он будет выполнять "cumsum", только если совпадают значения в столбцах Serial #, BranchID и Info.

Я думал, что мог бы сделать что-то вроде ниже, но я только получаю df, который возвращает только индекс:

df[df.columns.difference(['Serial#', 'Branch ID', 
'Info'])].apply(pd.to_numeric, errors='coerce')
# converting other columns(not the three groupby columns) to numeric values 

df_cumulative = df.groupby(['Serial#', 'Branch ID', 
'Info']).cumsum().add_suffix('_cumulative')

Конечный результат в идеале был бы:

           Serial#  Branch ID   Info                 Value1_cum  Value2_cum
        0     1       2         Apples 20pk ABC123       4        5
        1     6       7         Bananas 20pk ABC123      9        0
        2     1       2         Apples 20pk ABC123       12       14

Спасибо!

1 Ответ

0 голосов
/ 11 июля 2019

В вашем случае вам нужно переписать значение обратно в df, тогда

l=['Serial #', 'Branch ID', 
'Info']
df=df.drop(l,1).apply(pd.to_numeric, errors='coerce').combine_first(df)
df=df.set_index(l).groupby(level=[0,1,2]).cumsum().add_suffix('_cumulative').reset_index()
df
df
   Serial #  Branch ID  ... Value1_cumulative  Value2_cumulative
0       1.0        2.0  ...                 4                  5
1       6.0        7.0  ...                 9                  0
2       1.0        2.0  ...                12                 14
[3 rows x 5 columns]
...