【问题标题】:How can I count a resampled multi-indexed dataframe in pandas如何计算熊猫中重新采样的多索引数据帧
【发布时间】:2014-07-04 11:56:58
【问题描述】:

我找到了有关如何重新采样多索引的说明:

Resampling Within a Pandas MultiIndex

但是,一旦我使用 count 而不是 sum,解决方案就不再起作用了

这可能与:Resampling with 'how=count' causing problems

countstrings 不起作用:

values_a =[1]*16
states = ['Georgia']*8 + ['Alabama']*8
#cities = ['Atlanta']*4 + ['Savanna']*4 + ['Mobile']*4 + ['Montgomery']*4
dates = pd.DatetimeIndex([datetime.datetime(2012,1,1)+datetime.timedelta(days = i) for i in range(4)]*4)
df2 = pd.DataFrame(
    {'value_a': values_a},
    index = [states, dates])
df2.index.names = ['State', 'Date']
df2.reset_index(level=[0], inplace=True)
print(df2.groupby(['State']).resample('W',how='count'))

产量:

         2012-01-01           2012-01-08         
              State  value_a       State  value_a
State                                            
Alabama           2        2           6        6
Georgia           2        2           6        6

sumnumbers 作为值的工作版本

values_a =[1]*16
states = ['Georgia']*8 + ['Alabama']*8
#cities = ['Atlanta']*4 + ['Savanna']*4 + ['Mobile']*4 + ['Montgomery']*4
dates = pd.DatetimeIndex([datetime.datetime(2012,1,1)+datetime.timedelta(days = i) for i in range(4)]*4)
df2 = pd.DataFrame(
    {'value_a': values_a},
    index = [states, dates])
df2.index.names = ['State', 'Date']
df2.reset_index(level=[0], inplace=True)
print(df2.groupby(['State']).resample('W',how='sum'))

产量(注意没有重复的“状态”):

                    value_a
State   Date               
Alabama 2012-01-01        2
        2012-01-08        6
Georgia 2012-01-01        2
        2012-01-08        6

【问题讨论】:

    标签: python pandas time-series hierarchical-data


    【解决方案1】:

    当使用count 时,状态不是一个讨厌的列(它可以计算字符串),所以resample 将对其应用计数(尽管输出不是我所期望的)。你可以这样做(告诉它只将count 应用于value_a),

    >>> print df2.groupby(['State']).resample('W',how={'value_a':'count'})
    
                        value_a
    State   Date               
    Alabama 2012-01-01        2
            2012-01-08        6
    Georgia 2012-01-01        2
            2012-01-08        6
    

    或者更一般地说,您可以将不同类型的how 应用于不同的列:

    >>> print df2.groupby(['State']).resample('W',how={'value_a':'count','State':'last'})
    
                          State  value_a
    State   Date                        
    Alabama 2012-01-01  Alabama        2
            2012-01-08  Alabama        6
    Georgia 2012-01-01  Georgia        2
            2012-01-08  Georgia        6
    

    因此,虽然上面允许您 count 重新采样的多索引数据帧,但它并不能解释来自 how='count' 的输出行为。以下更接近我期望它的行为方式:

    print df2.groupby(['State']).resample('W',how={'value_a':'count','State':'count'})
    
                       State  value_a
    State   Date                      
    Alabama 2012-01-01      2        2
            2012-01-08      6        6
    Georgia 2012-01-01      2        2
            2012-01-08      6        6
    

    【讨论】:

    【解决方案2】:

    @Karl D soln 是正确的;这将在 0.14/master(即将发布)中实现,请参阅文档here

    In [118]: df2.groupby([pd.Grouper(level='Date',freq='W'),'State']).count()
    Out[118]: 
                        value_a
    Date       State           
    2012-01-01 Alabama        2
               Georgia        2
    2012-01-08 Alabama        6
               Georgia        6
    

    在 0.14 之前,很难使用基于时间的石斑鱼和另一个石斑鱼进行分组/重新采样。 pd.Grouper 允许非常灵活的规范来执行此操作。

    【讨论】:

    • 谢谢!石斑鱼听起来很棒!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2021-12-23
    • 2015-02-22
    • 2014-04-06
    相关资源
    最近更新 更多