【问题标题】:Double grouping data by bins AND time with pandas使用熊猫按箱和时间对数据进行双重分组
【发布时间】:2016-11-18 16:49:11
【问题描述】:

我正在尝试在时间窗口内对时间序列(每小时和每小时温度值)的值进行分类。 也就是说,从最初的每小时值,我想每天、每周或每月提取分箱值。 我曾尝试将groupby+TimeGrouper(" ")pd.cut 结合使用,但效果不佳。

我从这个tutorial 中发现了一个很好的函数,它建议映射数据(将每个值与下一列的映射范围相关联),然后根据它进行分组。

def map_bin(x, bins):
    kwargs = {}
    if x == max(bins):
        kwargs['right'] = True
    bin = bins[np.digitize([x], bins, **kwargs)[0]]
    bin_lower = bins[np.digitize([x], bins, **kwargs)[0]-1]
    return '[{0}-{1}]'.format(bin_lower, bin)

df['Binned'] = df['temp'].apply(map_bin, bins=freq_bins)

但是,应用此函数会导致 IndexError: index n is out of bounds for axis 0 with size n

理想情况下,我希望完成这项工作并将其应用于同时实现双重分组:一个按 bin,一个按 timegrouper。

【问题讨论】:

    标签: numpy pandas group-by grouping binning


    【解决方案1】:

    更新:
    由于双索引列,我之前的尝试似乎导致了问题。我已经简化了一些看起来效果更好的东西。

    import pandas as pd
    import numpy as np
    xaxis = np.linspace(0,50)
    temps = pd.Series(data=xaxis,name='temps')
    times = pd.date_range(start='2015-07-15',periods=50,freq='6H')
    temps.index = times
    
    bins = [0,10,20,30,40,50]
    
    temps.resample('W').agg(lambda series:pd.value_counts(pd.cut(series,bins),sort=False)).unstack()
    

    这个输出:

               (0, 10]  (10, 20]    (20, 30]    (30, 40]    (40, 50]
    2015-07-19       9        10           0           0           0
    2015-07-26       0         0          10          10           8
    2015-08-02       0         0           0           0           2
    

    【讨论】:

    • Alton,我想同时按垃圾箱和按天/周分组
    • 哈,那太简单了!!假设我有一个传感器每隔一小时记录一次室温(实际上是 10/15 分钟,但我已经在 pandas 中对其进行了重新采样)。因此我的 df 非常简单:第一列:时间戳(索引),第二列:温度如果我的箱是 [20, 22,24,26,28,30],我想以这样的方式对数据进行分组我知道每天和每周在 20
    • Alton,我不确定它有什么问题,但是您建议的代码为每个值范围返回完全相同的计数,这对于您的数据可能没问题(因为您生成它的方式)但是不适合我的。知道为什么会发生这种情况吗?
    • 奥尔顿,这句话给了我寻找几天的答案!
    • Alton,我们可以在 pvt 聊聊吗?
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多