如何计算熊猫中重新采样的多索引数据帧
Posted
技术标签:
【中文标题】如何计算熊猫中重新采样的多索引数据帧【英文标题】: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
count 和 strings 不起作用:
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
以 sum 和 numbers 作为值的工作版本
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
【问题讨论】:
【参考方案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
【讨论】:
@Karl D. 你也想在这里发布答案吗:***.com/questions/23688355/… 那个链接只是把我带到了这个问题。 对不起,我的意思是这个:***.com/questions/19745656/… 是的,这似乎是相关的。【参考方案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
允许非常灵活的规范来执行此操作。
【讨论】:
谢谢!石斑鱼听起来很棒!以上是关于如何计算熊猫中重新采样的多索引数据帧的主要内容,如果未能解决你的问题,请参考以下文章
Pandas 将时间序列数据重新采样为 15 分钟和 45 分钟 - 使用多索引或列