【问题标题】:Group by and Sum in Pandas without losing columns在 Pandas 中分组和求和而不丢失列
【发布时间】:2018-05-21 19:34:59
【问题描述】:

我有一个如下所示的数据框:

--------------------------------------------------------------------
|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. 

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 您是否总是希望输出中TradeGroup 列的最小From 和最大To
  • df.groupby(['TradeGroup'])['Contribution'].sum()

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


【解决方案1】:

用途:

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

【讨论】:

  • 感谢您的帮助。但是,我对贡献总和感到非常奇怪。例如:-0.0135596483407320.01442512535932610.00866804...与 SQL 输出相比是不正确的
  • 你能提供显示非常奇怪数字的数据吗?这适用于给定的示例。
  • 缺少数据,即 NaN 在 sql 和 pandas 之间的处理方式可能不同。
  • 没有缺失数据。数据库很大。大约 3GB。这是贡献 0.0003936101689380279 的示例,
  • 这是一个简单的计算,您将不得不进行一些故障排除。抱歉,语法很容易找到您的问题需要一些时间。
【解决方案2】:

您需要确保贡献列是数字而不是字符串,才能像 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

【讨论】:

  • 就是这样。谢谢
猜你喜欢
  • 2017-01-19
  • 1970-01-01
  • 2020-03-17
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 2018-07-30
  • 1970-01-01
相关资源
最近更新 更多