Добавление строки с промежуточным итогом по категориям в мой фрейм данных

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

Я пытался использовать pd.groupby и сводную таблицу и изменить индекс, но мне не удается представить данные так, как я этого хочу.

  • Создает промежуточный итог «USD_Balance» для каждого «Клиента», но добавляет его в виде столбца:
df_balance['Subtotal'] = df_balance.groupby('Client')['USD_Balance'].transform('sum')
  • Создание группы и слияние с моей необработанной таблицей дает мне тот же результат.
+----------+-------------+------------+
|CLient ID | USD_Balance | Subtotal   |
+----------+---------+------------+----
|       1  |     2       |     6      |      
|       1  |     2       |     6      |     
|       1  |     2       |     6      |    
+----------+-------------+------------+
  • Как я хотел бы отображать свои данные:
|---------------------|------------------|
|      Client ID      |    USD_Balance   |
|---------------------|------------------|
|          1          |         2        |
|---------------------|------------------|
|          1          |         2        |
|---------------------|------------------|
|          1          |         2        |
|---------------------|------------------|
|        SubTotal     |         6        |
|---------------------|------------------|

Я хотел бы добавить строку промежуточных итогов с соответствующим значением gg для каждой группы идентификаторов клиентов.

Заранее спасибо за любые указания о том, как представить мои данные таким образом!


person CJ123    schedule 18.06.2019    source источник
comment
Я думаю, что это с groupby, так что это не совсем то же самое, что ответ на дубликат. ОП просто не предоставил больше client ids. @cs95   -  person Erfan    schedule 18.06.2019
comment
@Erfan А, верно. Я уверен, что это дубликат чего-то. Дайте мне знать, если вы найдете что-нибудь. Откроется пока.   -  person cs95    schedule 18.06.2019
comment
У меня есть ответ на этот вопрос, не возражаете, если я опубликую его? @cs95   -  person Erfan    schedule 18.06.2019
comment
@Erfan уверен и проголосовал.   -  person cs95    schedule 18.06.2019


Ответы (3)


Вы можете использовать groupby и получить доступ к каждой группе и добавить строку Промежуточный итог:

dfs = []

for _, d in df.groupby('CLient ID', as_index=False):
    d.loc['Total', 'USD_Balance'] = df['USD_Balance'].sum()
    dfs.append(d)

df_final = pd.concat(dfs, ignore_index=True)

   CLient ID  USD_Balance
0        1.0          2.0
1        1.0          2.0
2        1.0          2.0
3        NaN          6.0
person Erfan    schedule 18.06.2019

sum_res= df.groupby(['CLient ID'],as_index=False)['USD_Balance'].sum()
sum_res['grand_total'] ='Grand Total'
df.sort_values(by=['CLient ID'],ascending=[True],inplace=True)

Отделить два столбца от исходного фрейма данных после сортировки
res = df[['CLient ID','USD_Balance']]
final_res = pd.concat([res,sum_res])
final_res = final_res.sort_values(by=['CLient ID','grand_total'],ascending=[True,True],na_position='first')
final_res['CLient ID'] =np.where(final_res['grand_total'].isnull(), final_res['CLient ID'], final_res['grand_total'])

final_res.drop(['grand_total'],axis=1,inplace=True)

person tawab_shakeel    schedule 18.06.2019
comment
Вы приветствуете, когда @CJ123 одобряет ответ, чтобы больше людей могли извлечь выгоду из решения. - person tawab_shakeel; 20.06.2019

Вы согласны сделать это немного по-другому?

dftotal = df.groupby('CLient ID')['USD_Balance'].sum().reset_index()
dftotal['CLient ID'] = 'SubTotal'
pd.concat([df, dftotal])

Выход:

  CLient ID  USD_Balance
0         1            2
1         1            2
2         1            2
0  SubTotal            6
person Scott Boston    schedule 18.06.2019