首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按组减少熊猫数据

按组减少熊猫数据
EN

Stack Overflow用户
提问于 2018-06-21 19:34:41
回答 3查看 11.5K关注 0票数 2

我已经搜索了很多次了,但是我无法理解这个问题:

我有一个熊猫的数据图,看起来是这样的:

代码语言:javascript
复制
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

要求

  1. 我想按日期和名称分组:
  2. 把股票的数量加起来
  3. 为股价设置加权平均栏(权重为NoShares)
  4. 平均音量并将其作为一列
  5. 保持现有的关系

所以我的输出应该是这样的:

代码语言:javascript
复制
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

我尝试了堆栈溢出的文档和其他答案,但似乎无法正确处理。感谢你的帮助。干杯。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-21 20:08:25

这是我的解决方案:

代码语言:javascript
复制
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

之后只有reset_index()。

票数 6
EN

Stack Overflow用户

发布于 2018-06-21 20:10:19

我在这里做了个假设。当你说组的日期和名称,并保持关系-我假设,滴答和关系也将是独特的,这些组。因此,为了简单起见,我将所有4项进行分组。

代码语言:javascript
复制
df = pd.DataFrame([
                ['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']],
             columns = ['date', 'ticker', 'Name', 'NoShares',
                        'SharePrice', 'Volume', 'Relation'])

def process_date(dg):
    return pd.DataFrame([[
                        dg['NoShares'].sum(),
                        (dg['NoShares'] * dg['SharePrice']).sum() / dg['NoShares'].sum(),
                        dg['Volume'].mean(),
                        ]], columns=['NoShares', 'SharePrice', 'Volume'])

df.groupby(['date', 'ticker', 'Name', 'Relation']).apply(process_date).reset_index(4, drop=True).reset_index(drop=False)

结果:

代码语言:javascript
复制
     date ticker Name Relation  NoShares  SharePrice  Volume
0  2/1/10    aaa  yyy        o         1    2.000000     5.0
1  2/1/10    aaa  zzz        d         3    3.666667     1.5
2  2/5/10    bbb  xxx       do         5    5.000000     1.0
3  2/5/10    ccc  www        d        10    5.000000     1.0
4  2/5/10    ddd  vvv        o         5    5.000000     1.0
5  2/6/10    aaa  zzz        d         1    1.000000     3.0
票数 0
EN

Stack Overflow用户

发布于 2022-01-19 13:28:36

Dickster和Leo的答案都很好,但请注意,默认情况下,.groupbydropna=True设置。因此,如果您有一个数据集,并在多个列上执行groupby,其中一些列可能包含NaN's,那么Pandas将删除这些组。最后的DataFrame将有较少的行。

Server上的相同SQL查询不会在group子句中的列中删除带空值的行。我不知道其他关系数据库管理系统是否如此,但请记住,在默认情况下,Pandas以不同的方式对待group by

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50976297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档