Pandas:使用 MultiIndex 列按不同列聚合
Posted
技术标签:
【中文标题】Pandas:使用 MultiIndex 列按不同列聚合【英文标题】:Pandas: aggregating by different columns with MultiIndex columns 【发布时间】:2019-03-04 21:33:59 【问题描述】:我想获取一个包含 MultiIndex 列(其中索引是 DatetimeIndex)的数据框,并根据列通过不同的函数进行聚合。
例如,考虑下表,其中索引包括日期,第一级列是价格和交易量,第二级列是代码(例如 AAPL 和 AMZN)。
df1 = pd.DataFrame("ticker":["AAPL"]*365,
'date': pd.date_range(start='20170101', end='20171231'),
'volume' : [np.random.randint(50,100) for i in range(365)],
'price': [np.random.randint(100,200) for i in range(365)])
df2 = pd.DataFrame("ticker":["AMZN"]*365,
'date': pd.date_range(start='20170101', end='20171231'),
'volume' : [np.random.randint(50,100) for i in range(365)],
'price': [np.random.randint(100,200) for i in range(365)])
df = pd.concat([df1,df2])
grp = df.groupby(['date', 'ticker']).mean().unstack()
grp.head()
我想做的是按月汇总数据,但取价格的平均值和数量的总和。
我原以为grp.resample("MS").agg("price":"mean", "volume":"sum")
中的一些东西应该可以工作,但它不是因为多索引列。完成此任务的最佳方法是什么?
【问题讨论】:
【参考方案1】:你可以
df.groupby([pd.to_datetime(df.date).dt.strftime('%Y-%m'),df.ticker]).\
agg("price":"mean", "volume":"sum").unstack()
Out[529]:
price volume
ticker AAPL AMZN AAPL AMZN
date
2017-01 155.548387 141.580645 2334 2418
2017-02 154.035714 156.821429 2112 2058
2017-03 154.709677 148.806452 2258 2188
2017-04 154.366667 149.366667 2271 2254
2017-05 154.774194 155.096774 2331 2264
2017-06 147.333333 145.133333 2220 2302
2017-07 149.709677 150.645161 2188 2412
2017-08 150.806452 154.645161 2265 2341
2017-09 157.033333 151.466667 2199 2232
2017-10 149.387097 145.580645 2303 2203
2017-11 154.100000 150.266667 2212 2275
2017-12 156.064516 149.290323 2265 2224
【讨论】:
以上是关于Pandas:使用 MultiIndex 列按不同列聚合的主要内容,如果未能解决你的问题,请参考以下文章
不同长度的pandas groupby元组-ValueError:在通过级别中找不到值:MultiIndex
使用 MultiIndex 时,如何将此 Pandas 列类型保留为日期时间?
从字典列表创建 Pandas MultiIndex 的最佳方法是啥?