为了账号安全,请及时绑定邮箱和手机立即绑定

使用 pandas.MultiIndex 重采样:Resampler.aggregate()

使用 pandas.MultiIndex 重采样:Resampler.aggregate()

江户川乱折腾 2022-05-24 17:00:23
我正在尝试重新采样数据框。首先,我想在结果中保留几个聚合。其次,对于特定列,还有一个额外的聚合感兴趣。由于此聚合仅与单个列相关,因此可以将重采样器限制在此列,以免不必要地将聚合应用于其他列。此方案适用于简单的一维列索引:import numpy as npimport pandas as pddf = pd.DataFrame(data=np.random.rand(50,4), index=pd.to_datetime(np.arange(0, 50), unit="s"), columns=["a", "b", "c", "d"])r = df.resample("10s")result = r.aggregate(["mean", "std"])result[("d", "ffill")] = r["d"].ffill()print(result)但是,一旦我开始使用多索引列,问题就出现了。首先,我不能一次保留多个聚合:df.columns = pd.MultiIndex.from_product([("a", "b"), ("alpha", "beta")])r = df.resample("10s")    # can be omittedresult = r.aggregate(["mean", "std"])---> AttributeError: 'Series' object has no attribute 'columns'其次,重采样器不能再局限于相关列:r[("b", "beta")].ffill()--> KeyError: "Columns not found: 'b', 'beta'"如何将我的关注点从简单指数转变为多指数?
查看完整描述

2 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

您可以使用pd.Grouperagroupby而不是重新采样,例如:


result = df.groupby(pd.Grouper(freq='10s',level=0)).aggregate(["mean", "std"])

print (result)

                           a                                       b  \

                        alpha                beta               alpha   

                         mean       std      mean       std      mean   

1970-01-01 00:00:00  0.460569  0.312508  0.476511  0.260534  0.479577   

1970-01-01 00:00:10  0.441498  0.315277  0.487855  0.306068  0.535842   

1970-01-01 00:00:20  0.569884  0.248503  0.320552  0.288479  0.507755   

1970-01-01 00:00:30  0.478037  0.262654  0.552214  0.251581  0.505132   

1970-01-01 00:00:40  0.611227  0.328916  0.473773  0.241604  0.358298   



                                   beta            

                          std      mean       std  

1970-01-01 00:00:00  0.357493  0.448487  0.294432  

1970-01-01 00:00:10  0.259145  0.472250  0.320954  

1970-01-01 00:00:20  0.369490  0.432944  0.150473  

1970-01-01 00:00:30  0.298759  0.381614  0.248785  

1970-01-01 00:00:40  0.203831  0.381412  0.374965  

对于第二部分,我不确定您的意思,但是根据在单列级别的情况下给出的结果,试试这个它会给出一个结果


result[("b", "beta",'ffill')] = df.groupby(pd.Grouper(freq='10s',level=0))[[("b", "beta")]].first()


查看完整回答
反对 回复 2022-05-24
?
动漫人物

TA贡献1815条经验 获得超10个赞

应该是aggregate. 一个复飞将是stack:


(df.stack().groupby(level=-1)

  .apply(lambda x:x.resample('10s', level=0).aggregate(["mean", "std"]))

  .unstack(level=0)

)


查看完整回答
反对 回复 2022-05-24
  • 2 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号