Группировать и суммировать в пандах без потери столбцов - PullRequest
0 голосов
/ 21 мая 2018

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

--------------------------------------------------------------------
|TradeGroup | Fund Name | Contribution | From       | To           |
|  A        | Fund_1    |   0.20       | 2013-01-01 | 2013-01-02   |
|  B        | Fund_1    |   0.10       | 2013-01-01 | 2013-01-02   |
|  A        | Fund_1    |   0.05       | 2013-01-03 | 2013-01-04   |
|  B        | Fund_1    |   0.45       | 2013-01-03 | 2013-01-04   |
--------------------------------------------------------------------

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

--------------------------------------------------------------------
|TradeGroup | Fund Name | Contribution | From       | To           |
|  A        | Fund_1    |   0.25       | 2013-01-01 | 2013-01-04   |
|  B        | Fund_1    |   0.55       | 2013-01-01 | 2013-01-04   |
--------------------------------------------------------------------

Я не могу решить эту проблему с помощью Dataframe.Я пробовал

df.groupby('TradeGroup')['Contribution'].sum()

Однако это не работает.Эквивалентный SQL для этого будет

Select SUM(Ctp) from Table Group By TradeGroup. 

. Любая помощь будет принята с благодарностью.Спасибо

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Необходимо убедиться, что столбец вклада является числовым, а не строками, чтобы получить правильные совпадающие числа, как в SQL.Я думаю, что странные ноты, которые вы получаете, связаны со строковым характером столбца «вклад».Тогда должно работать следующее:

import pandas as pd
import numpy as np
a=pd.DataFrame([['A','Fund_1','0.20','2013-01-01','2013-01-02'],
['B','Fund_1','0.10','2013-01-01','2013-01-02'],['A','Fund_1','0.05','2013-
01-03','2013-01-04'],['B','Fund_1','0.45','2013-01-03','2013-01-04']],
            columns=['TraderGroup', 'Fund Name','Contribution','From', 'To'])
print a
a['Contribution'] = pd.to_numeric(a['Contribution'], errors='coerce')
b=a.groupby(['TraderGroup','Fund Name']).agg({'Contribution':np.sum,
                                         'From':'min','To':'max'}).reset_index()
print b
0 голосов
/ 21 мая 2018

Использование:

df.groupby(['TradeGroup', 'Fund Name']).agg({'Contribution':'sum',
                                             'From':'first',
                                             'To':'last'}).reset_index()

Вывод:

    TradeGroup    Fund Name  Contribution          From              To
0    A           Fund_1              0.25   2013-01-01    2013-01-04   
1    B           Fund_1              0.55   2013-01-01    2013-01-04   

Или вы можете использовать min и max вместо first и last, если ваш фрейм данных отсутствуетзаказал.

...