【问题标题】:Aggregate data by index and column in dataframe按数据框中的索引和列聚合数据
【发布时间】:2019-06-28 07:53:10
【问题描述】:

我有这样的股票价格数据。日期实际上是数据框的索引。其余是列。

date         open    high    low    close  name
2013-01-01   14.50   14.80   14.25  14.70  AAA
2013-01-02   14.70   14.90   14.30  14.68  AAA
2013-01-01   14.50   14.80   14.25  14.70  BBB
2013-01-02   14.70   14.90   14.30  14.68  BBB
2013-01-01   14.50   14.80   14.25  14.70  CCC
2013-01-02   14.70   14.90   14.30  14.68  CCC

我想要一个新的数据框,其中包含每个唯一名称按月计算的开盘价、最高价、最低价和收盘价的平均值。

我能得到的最好的方法是使用此代码,但没有“名称”列。

stock_agg = {
  'open': {'ave_open': 'mean'},
  'high': {'ave_high': 'mean'},
  'low': {'ave_low': 'mean'},
  'close': {'ave_close': 'mean'}
}
stock_group = stock_data.groupby([pd.Grouper(freq='M')]).agg(stock_agg)

在上面的示例中,如何按名称和月份进行分组?

【问题讨论】:

    标签: python python-3.x aggregate-functions


    【解决方案1】:

    pandas.DataFrame.groupby可以处理多个by

    import pandas as pd
    
    df.groupby([df.index.month, 'name']).mean()
    

    输出:

               open   high     low  close
    date name                            
    1    AAA   14.6  14.85  14.275  14.69
         BBB   14.6  14.85  14.275  14.69
         CCC   14.6  14.85  14.275  14.69
    

    【讨论】:

    • 谢谢,克里斯。这聚合得很好。但我不希望日期采用datetime 格式,也不希望将其转换为整数,如 1、2 等。这可能吗?
    • 我的意思是我希望日期采用日期时间格式,而不是像 1、2 等这样的整数。
    【解决方案2】:

    只需在groupby 中添加第二个级别:

    stock_group = stock_data.groupby([pd.Grouper(freq='M'), 'name']).agg(stock_agg)
    

    【讨论】:

    • 谢谢谢尔盖。我之前确实在我的 groupby 中添加了“名称”。但是月份和股票名称成为 df 指数的一部分。我想按月绘制精选股票。不知道该怎么做。例如,我不能这样做:stock_group[stock_group.name=='AAA] 当名称是索引的一部分时。我可以吗?
    • @python_beginner 你应该说预期的结果是什么。
    • 我很抱歉。从下一次开始,我将明确我的最终目标或预期结果。
    猜你喜欢
    • 2019-07-21
    • 2021-08-07
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多