按组减少 panda 数据框

ash*_*her 3 python group-by pandas

我一直在广泛搜索,但无法解决这个问题:

我在 pandas 中有一个数据框,如下所示:

date    ticker Name NoShares SharePrice Volume Relation
2/1/10  aaa    zzz  1        1          1      d 
2/1/10  aaa    yyy  1        2          5      o
2/1/10  aaa    zzz  2        5          2      d  
2/5/10  bbb    xxx  5        5          1      do
2/5/10  ccc    www  5        5          1      d
2/5/10  ccc    www  5        5          1      d
2/5/10  ddd    vvv  5        5          1      o
2/6/10  aaa    zzz  1        1          3      d
Run Code Online (Sandbox Code Playgroud)

要求

  1. 我想按日期和名称分组,并且:
  2. 股数合计
  3. 有一个股价加权平均列(权重是无股)
  4. 平均体积并将其作为一列
  5. 保持关系不变

所以我的输出将如下所示:

date    ticker Name NoShares SharePrice Volume Relation
2/1/10  aaa    zzz  3        3.6        1      d 
2/1/10  aaa    yyy  1        2          5      o
2/5/10  bbb    xxx  5        5          1      do
2/5/10  ccc    www  10       5          1      d
2/5/10  ddd    vvv  5        5          1      o
2/6/10  aaa    zzz  1        1          3      d
Run Code Online (Sandbox Code Playgroud)

我尝试了有关堆栈溢出的文档和其他答案,但似乎无法正确解决。感谢您的帮助。干杯。

Dic*_*ter 6

这是我的解决方案:

grpby = df.groupby(['date','Name'])
a = grpby.apply(lambda x: np.average(a = x['SharePrice'],weights=x['NoShares'])).to_frame(name='SharePrice')
b = grpby.agg({'NoShares':'sum','Volume':'mean','Relation':'max'})
print b.join(a)

             Volume Relation  NoShares  SharePrice
date   Name                                       
2/1/10 yyy   5.0000        o         1      2.0000
       zzz   1.5000        d         3      3.6667
2/5/10 vvv   1.0000        o         5      5.0000
       www   1.0000        d        10      5.0000
       xxx   1.0000       do         5      5.0000
2/6/10 zzz   3.0000        d         1      1.0000
Run Code Online (Sandbox Code Playgroud)

之后只需reset_index()即可。

  • 创建 lambda 后可以跳过 join 并直接聚合: `weigted_mean = lambda x: np.average(x, Weights=tdf.loc[x.index, "NoShares"]) tdf.groupby(['date','Name ']).agg({'NoShares':'sum','SharePrice': weigted_mean, 'Volume': 'mean'}).reset_index()` (2认同)