【问题标题】:python blaze calculate mean of multiple columnspython blaze计算多列的平均值
【发布时间】:2016-01-18 17:28:38
【问题描述】:

我有一个像这样的 python blaze 数据

import blaze as bz

bdata = bz.Data([(1, 'Alice', 100.9, 100),
           (2, 'Bob', 200.6, 200),
           (3, 'Charlie', 300.45, 300),
           (5, 'Edith', 400, 400)],
          fields=['id', 'name', 'revenue', 'profit'])

我想计算数字列的平均值。我试过这样的东西

print {col: bdata[col].mean() for col in ['revenue', 'profit']}

我明白了

{'profit': 250.0, 'revenue': 250.4875}

但我想像pandas 一样一次性计算,比如data.mean()

有什么想法或建议???

【问题讨论】:

    标签: python pandas blaze


    【解决方案1】:

    Pandas 聚合有点神奇,我认为如果没有某种逻辑,您将无法跳过非数字列。

    如果您可以选择添加虚拟列,则可以使用by 对整个表进行聚合。

    看起来像这样:

    bdata = bz.Data([('fnord', 1, 'Alice', 100.9, 100),
               ('fnord', 2, 'Bob', 200.6, 200),
               ('fnord', 3, 'Charlie', 300.45, 300),
               ('fnord', 5, 'Edith', 400, 400)],
              fields=['dummy', 'id', 'name', 'revenue', 'profit'])
    bz.by(bdata.dummy, avg_profit=bdata.profit.mean(), avg_revenue=bdata.revenue.mean())
    
       dummy  avg_profit  avg_revenue
    0  fnord         250     250.4875
    

    虽然这也不是特别简洁,并且需要修改您的数据。

    您可以使用odo 快速访问简洁的 Pandas 语法:

    from odo import odo
    import Pandas as pd
    odo(bdata, pd.DataFrame).mean()
    

    【讨论】:

      【解决方案2】:

      我认为使用summary 减少可能会更好:

      from blaze import *
      
      resume = summary(bdata,avg_profit=bdata.profit.mean(), avg_revenue=bdata.revenue.mean())
      SummaryStats = pd.DataFrame(pd.Series(dict( (k,v) for k,v in zip(resume.fields,compute(resume)) ))).T
      

      如果你不关心结果是pd.DataFrame,最后一行可以减少到compute(resume)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-06
        • 1970-01-01
        • 2015-09-05
        • 1970-01-01
        • 2018-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多