在Pandas中分组和总和而不会丢失列

时间:2018-05-21 19:34:59

标签: python python-3.x pandas pandas-groupby pandasql

我有一个如下所示的Dataframe:

--------------------------------------------------------------------
|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 :(得分:1)

您需要确保贡献列是数字而不是字符串才能获得正确的匹配数字,如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

答案 1 :(得分:0)

使用:

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   

或者,如果您的数据框没有排序,则可以使用minmax代替firstlast