【发布时间】:2017-11-26 20:07:25
【问题描述】:
对于创建看似与 this question 重复的内容表示歉意。我有一个形状或多或少类似于下面的数据框:
df_lenght = 240
df = pd.DataFrame(np.random.randn(df_lenght,2), columns=['a','b'] )
df['datetime'] = pd.date_range('23/06/2017', periods=df_lenght, freq='H')
unique_jobs = ['job1','job2','job3',]
job_id = [unique_jobs for i in range (1, int((df_lenght/len(unique_jobs))+1) ,1) ]
df['job_id'] = sorted( [val for sublist in job_id for val in sublist] )
df.set_index(['job_id','datetime'], append=True, inplace=True)
print(df[:5]) 返回:
a b
job_id datetime
0 job1 2017-06-23 00:00:00 -0.067011 -0.516382
1 job1 2017-06-23 01:00:00 -0.174199 0.068693
2 job1 2017-06-23 02:00:00 -1.227568 -0.103878
3 job1 2017-06-23 03:00:00 -0.847565 -0.345161
4 job1 2017-06-23 04:00:00 0.028852 3.111738
我需要重新采样 df['a'] 以得出每日滚动平均值,即应用 .resample('D').mean().rolling(window=2).mean()。
我尝试了两种方法:
1 - 拆垛和堆叠,推荐here
df.unstack('job_id','datetime').resample('D').mean().rolling(window=2).mean().stack('job_id', 'datetime')
这会返回一个错误
2 - 使用pd.Grouper,推荐here
level_values = df.index.get_level_values
result = df.groupby( [ level_values(i) for i in [0,1] ] + [ pd.Grouper(freq='D', level=2) ] ).mean().rolling(window=2).mean()
这不会返回错误,但似乎没有对 df 进行适当的重新采样/分组。结果似乎包含每小时数据点,而不是每天:
print(result[:5])
a b
job_id datetime
0 job1 2017-06-23 NaN NaN
1 job1 2017-06-23 0.831609 1.348970
2 job1 2017-06-23 -0.560047 1.063316
3 job1 2017-06-23 -0.641936 -0.199189
4 job1 2017-06-23 0.254402 -0.328190
【问题讨论】:
-
你想如何处理job_id?
-
在索引层次结构中,
job_id在datetime之前,即job_id的每个值都会有一组datetime值 -
Jobid 出现异常,重采样时如何处理?
-
@Allen 我已经修改了问题以更好地代表我的数据集
标签: python pandas grouping multi-index