如何计算pandas中重新采样的多索引数据帧

时间:2014-05-15 20:50:23

标签: python pandas time-series hierarchical-data

我找到了如何重新采样多索引的描述:

Resampling Within a Pandas MultiIndex

然而,只要我使用count而不是sum,解决方案就不再起作用了

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

有关

无效计数字符串

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

总和数字作为值的工作版

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

2 个答案:

答案 0 :(得分:1)

使用count时,状态不是一个讨厌的列(它可以计算字符串),因此resample将对它应用计数(尽管输出不是我所期望的)。你可以这样做(告诉它只适用countvalue_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

答案 1 :(得分:1)

@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允许非常灵活的规范来执行此操作。