【问题标题】:pandas: working out mean and sum value for each stock in each day熊猫:每天计算每只股票的平均值和总和
【发布时间】:2015-07-22 03:26:37
【问题描述】:

我正在努力获取每天每只股票的成交量的平均值和总和。

我的数据是这样的

 ric    date    volume  
 vod    7-17     43
 vod    7-17     4444
 vod    7-17     53
 vod    7-18     66
 vod    7-19     77
 vod    7-19     29
 ...     ...     ...
 bat    7-17     87
 bat    7-18     99
 ...     ...     ...

我希望它转换为

ric    date    volume  day_v_vol    day_sum_vol
 vod    7-17     43     1513          4541
 vod    7-17     4444   1513          4541
 vod    7-17     53     1513          4541
 vod    7-18     66      66            66
 vod    7-19     77      53            106
 vod    7-19     29      53            106
 ...     ...     ...     ...           ...
 bat    7-17     87      87            87
 bat    7-18     99      99            99
 ...     ...     ...     ...           ...

我使用了'groupby'方法,

grouped=data.groupby(['ric','date'])
data['sumbas']=grouped.sum()
data['avbas']=grouped.mean()

但不是很方便。在“groupby”之后,我需要将新数据集与旧数据集合并。

任何人都可以给我一些可以直接生成我想要的快速方法吗?提前致谢!

【问题讨论】:

    标签: python pandas sum average


    【解决方案1】:

    您可以使用agg 传递要在groupby 对象上执行的函数列表。

    import numpy as np
    
    grouped = df.groupby(['date', 'ric']).volume.agg([sum, np.mean])
    grouped.columns = ['sumbas', 'avbas']
    
    >>> grouped
    
              sumbas  avbas
    date ric               
    7-17 bat      87     87
         vod    4530   1510
    7-18 bat      99     99
         vod      66     66
    7-19 vod     106     53
    

    你仍然需要把它加入你原来的 DataFrame:

    >>>df.set_index(['date', 'ric']).join(grouped) 
    
              volume  sumbas  avbas
    date ric                       
    7-17 bat      87      87     87
         vod      43    4530   1510
         vod    4444    4530   1510
         vod      43    4530   1510
    7-18 bat      99      99     99
         vod      66      66     66
    7-19 vod      77     106     53
         vod      29     106     53
    

    另一种方法是创建一个groupby 对象,然后迭代调用transform:

    gb_vol = df.groupby(['date', 'ric'])['volume']
    for f_name, func in zip(['daily_vol', 'davg_vol'], 
                            [np.sum, np.mean]):
        df[f_name] = gb_vol.transform(func)
    
    >>> df
       ric  date  volume  daily_vol  davg_vol
    6  bat  7-17      87         87        87
    0  vod  7-17      43       4530      1510
    1  vod  7-17    4444       4530      1510
    2  vod  7-17      43       4530      1510
    7  bat  7-18      99         99        99
    3  vod  7-18      66         66        66
    4  vod  7-19      77        106        53
    5  vod  7-19      29        106        53
    

    【讨论】:

    • 嗨,Alex 感谢您的代码。我导入了 pandas 和 numpy 并应用了您的代码。但是系统给了我:NameError: name 'df' is not defined
    • df 只是您使用的任何数据框的变量名称。
    • 再次感谢。我更改了变量名。但这一次它显示:ValueError:列重叠但未指定后缀:Index([u'avbas'], dtype='object')
    • 那是因为avbas 必须已经在原始数据框中。尝试在grouped.columns = ...中使用其他名称
    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多