【问题标题】:Bin column by time intervals and calculate the sum按时间间隔分列并计算总和
【发布时间】:2019-01-16 20:57:20
【问题描述】:

我有熊猫数据框:

df = pd.DataFrame({
    "computer": [0, 1, 2, 3, 0, 1, 2, 3],
    "time":     [0, 0, 1, 1, 2, 3, 4, 5],
    "value":    [4, 1, 5, 6, 1, 0, 3, 4],
})
df["time"] = pd.to_datetime(df["time"], unit="s")
df.set_index(["computer", "time"])

我想将time 列分成 4s 的间隔并对values 求和。 输出如下所示:

df = pd.DataFrame({
    "computer":   [0, 1, 2, 3, 2, 3],
    "start_time": [0, 0, 0, 0, 4, 4],
    "value":      [5, 1, 5, 6, 3, 4],
})
df["start_time"] = pd.to_datetime(df["start_time"], unit="s")
df.set_index(["computer", "start_time"])

我尝试应用Pandas group by time windows 提供的代码,但由于多索引,我无法让它工作。 我也尝试过resample 方法,但同样的问题也存在。

【问题讨论】:

    标签: python python-3.x pandas group-by pandas-groupby


    【解决方案1】:

    将groupby 与pd.Grouper 一起使用:

    u = (df.groupby(['computer', pd.Grouper(key='time', freq='4s')])
           .sum()
           .sort_index(level=1)
           .reset_index())
    u['time'] = u['time'].dt.second
    
    u
       computer  time  value
    0         0     0      5
    1         1     0      1
    2         2     0      5
    3         3     0      6
    4         2     4      3
    5         3     4      4
    

    您可以允许一个 groupby 调用来同时处理“计算机”上的分组和重新采样“时间”,而不是单独的 groupby 和 resample。

    【讨论】:

      【解决方案2】:

      使用reset_index,然后使用groupby 和resample:

      df.reset_index(level=0).groupby('computer').resample('4s')['value']\
         .sum().to_frame().sort_index(level=1)
      

      或

      df.reset_index('computer').groupby('computer').resample('4s')['value']\
         .sum().to_frame().sort_index(level=1)
      

      输出:

                                    value
      computer time                      
      0        1970-01-01 00:00:00      5
      1        1970-01-01 00:00:00      1
      2        1970-01-01 00:00:00      5
      3        1970-01-01 00:00:00      6
      2        1970-01-01 00:00:04      3
      3        1970-01-01 00:00:04      4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-06
        • 1970-01-01
        • 2020-10-16
        • 2023-02-20
        • 2015-11-06
        相关资源
        最近更新 更多