【问题标题】:Pandas TimeGrouper on multiindex多索引上的 Pandas TimeGrouper
【发布时间】:2017-05-19 22:06:39
【问题描述】:

我有一个 multiIndex pandas 数据框,其中第一级索引是一个组,第二级索引是时间。 我想要做的是,在每个组中,以日内观察的平均值重新采样到每日频率。

import pandas as pd
import numpy as np

data = pd.concat([pd.DataFrame([['A']*72, list(pd.date_range('1/1/2011', periods=72, freq='H')), list(np.random.rand(72))], index = ['Group', 'Time', 'Value']).T,
                  pd.DataFrame([['B']*72, list(pd.date_range('1/1/2011', periods=72, freq='H')), list(np.random.rand(72))], index = ['Group', 'Time', 'Value']).T,
                  pd.DataFrame([['C']*72, list(pd.date_range('1/1/2011', periods=72, freq='H')), list(np.random.rand(72))], index = ['Group', 'Time', 'Value']).T],
                  axis = 0).set_index(['Group', 'Time'])

这是我迄今为止尝试过的:

daily_counts = data.groupby(pd.TimeGrouper('D'), level = ['Time']).mean()

但我收到以下错误:

TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'MultiIndex'

知道如何解决这个问题吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您需要先将列转换为float,然后使用Grouper

    data['Value'] = data['Value'].astype(float)
    daily_counts = data.groupby([pd.Grouper(freq='D', level='Time'), 
                                 pd.Grouper(level='Group')])['Value'].mean()
    
    print (daily_counts) 
    Time        Group
    2011-01-01  A        0.548358
                B        0.612878
                C        0.544822
    2011-01-02  A        0.529880
                B        0.437062
                C        0.388626
    2011-01-03  A        0.563854
                B        0.479299
                C        0.557190
    Name: Value, dtype: float64
    

    另一种解决方案:

    data = data.reset_index(level='Group')
    print (data.groupby('Group').resample('D')['Value'].mean())
    

    【讨论】:

    • 非常感谢这解决了我的问题。所以我想主要的收获是,当我想在 MultiIndex 上进行分组时,我仍然需要将所有索引级别作为分组器传递。公平吗?
    • 是的,但可能是更常用的第二种解决方案,请参阅here
    • 在您的第二个解决方案中,值得强调这个错误(在 pandas 0.19 中修复)可能会阻止在重新采样中使用 kwargs:github.com/pandas-dev/pandas/issues/13235
    • 请注意,pd.TimeGrouper() 已被弃用,取而代之的是带有freq 参数集的pd.Grouper()
    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 2017-06-28
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2020-09-05
    • 2021-08-25
    相关资源
    最近更新 更多