在 Pandas 中分组并求和而不丢失列
Group by and Sum in Pandas without losing columns
我有一个如下所示的数据框:
--------------------------------------------------------------------
|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.
如有任何帮助,我们将不胜感激。谢谢
使用:
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
。
您需要确保贡献列是数字而不是字符串才能获得正确的匹配数字,如 SQL 中那样。我认为您得到的奇怪编号是由于 'contribution' 列的字符串性质造成的。那么以下应该有效:
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
我有一个如下所示的数据框:
--------------------------------------------------------------------
|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.
如有任何帮助,我们将不胜感激。谢谢
使用:
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
。
您需要确保贡献列是数字而不是字符串才能获得正确的匹配数字,如 SQL 中那样。我认为您得到的奇怪编号是由于 'contribution' 列的字符串性质造成的。那么以下应该有效:
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