当前位置: 首页 > 面试题库 >

使用包含时间序列的多索引重新采样熊猫数据框

苏雅珺
2023-03-14
问题内容

为创建这个问题的重复而道歉。我有一个数据框,其形状大致如下图所示:

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 -拆垛和堆积,建议在这里

df.unstack('job_id','datetime').resample('D').mean().rolling(window=2).mean().stack('job_id', 'datetime')

这返回一个错误

2 -使用pd.Grouper,建议在这里

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

问题答案:

首先让我们定义一个重采样函数:

def resampler(x):    
    return x.set_index('datetime').resample('D').mean().rolling(window=2).mean()

然后,我们对job_id进行分组并应用重采样器功能:

 df.reset_index(level=2).groupby(level=1).apply(resampler)

Out[657]: 
                          a         b
job_id datetime                      
job1   2017-06-23       NaN       NaN
       2017-06-24  0.053378  0.004727
       2017-06-25  0.265074  0.234081
       2017-06-26  0.192286  0.138148
job2   2017-06-26       NaN       NaN
       2017-06-27 -0.016629 -0.041284
       2017-06-28 -0.028662  0.055399
       2017-06-29  0.113299 -0.204670
job3   2017-06-29       NaN       NaN
       2017-06-30  0.233524 -0.194982
       2017-07-01  0.068839 -0.237573
       2017-07-02 -0.051211 -0.069917

让我知道这是否是您要的。



 类似资料:
  • 问题内容: 给定下面的熊猫DataFrame: 我想对数据重新采样以每小时计数一次,同时按位置分组以生成如下所示的数据框: 我尝试了resample()和groupby()的各种组合,但是没有运气。我将如何处理? 问题答案: 在我的原始帖子中,我建议使用。如今,使用代替。语法在很大程度上是相同的,但现在已不支持。 此外,虽然只能按DatetimeIndex分组,但可以按日期时间 列进行分组,而您可

  • 问题内容: 如何将大熊猫中的时间序列重新采样为每周从任意一天开始的每周频率?我看到有一个可选的关键字库,但它仅适用于少于一天的时间间隔。 问题答案: 您可以将锚定的偏移量传递给,以及它们涵盖此情况的其他选项。 例如,星期一的每周频率:

  • 我有一个小熊猫DataFrame我想重新取样,我希望你能帮我:) 我不能给你看,因为它是保密的,但我可以给你描述一个更简单的版本。 它有4列: -日期(YYYY-MM-DD格式) -国家 -数量 -频率 下面是我想做的: 根据行的不同,频率为每年或每月如果恰好是每月,则无需执行任何操作。 但如果是每年一次,我想将其改为每月一次,并插入11个新行,以便在考虑的12行(现有行和11个新行)中,国家将保

  • 我有一个多索引数据框,看起来像 uid tid文本 abc x t1 bcd y t2 uid 和 tid 是索引。我有一个 uid 列表,并希望获取与该列表中的 uid 相对应的行,但保留第 2 级索引值 (tid)。我想在不运行任何显式循环的情况下执行此操作。这可能吗?

  • 我可以从pandas文档中看出,您可以: 对于时间序列,您为什么不能: 我得到一个语法错误。不能在时间序列上执行多个切片范围吗?有解决办法吗?

  • 问题内容: 我有一个数据框,具有以下的multiindex列: 如何将列索引级别展平/合并为:“ Level1 | Level2”,例如,。等等?如果这不可能,是否有办法像我上面所做的那样不创建多索引列? 问题答案: 您可以随时更改列: