【问题标题】:Combine Pandas DataFrame Rows by Timestamp and Column按时间戳和列组合 Pandas DataFrame 行
【发布时间】:2018-04-23 03:40:01
【问题描述】:

我将下面的数据转换成如下所示的DataFrame

data = [
       {"start_ts": "2018-05-14 10:54:33", "end_ts": "2018-05-14 11:54:33", "product": "a", "value": 1},
       {"start_ts": "2018-05-14 11:54:33", "end_ts": "2018-05-14 12:54:33", "product": "a", "value": 1}, 
       {"start_ts": "2018-05-14 13:54:33", "end_ts": "2018-05-14 14:54:33", "product": "a", "value": 1},          
       {"start_ts": "2018-05-14 10:54:33", "end_ts": "2018-05-14 11:54:33", "product": "b", "value": 1}
   ]

    product start_ts            end_ts              value
0   a       2018-05-14 10:54:33 2018-05-14 11:54:33 1
1   a       2018-05-14 11:54:33 2018-05-14 12:54:33 1
2   a       2018-05-14 13:54:33 2018-05-14 14:54:33 1
3   b       2018-05-14 10:54:33 2018-05-14 11:54:33 1

我正在尝试通过查找产品的连续时间戳字段(其中 start_ts 等于产品的前一行的 end_ts)并将值列相加,将 DF 行以上分桶化为一行,如下所示。

预期:

    product start_ts            end_ts              value
0   a       2018-05-14 10:54:33 2018-05-14 12:54:33 2
1   a       2018-05-14 13:54:33 2018-05-14 14:54:33 1
2   b       2018-05-14 10:54:33 2018-05-14 11:54:33 1

我无法使用下面的代码获得上述预期值

def merge_dates(grp):
    date_groups = (grp['start_ts'] != grp['end_ts'].shift())
    return grp.groupby(date_groups).agg({'start_ts': 'first', 'end_ts': 'last'})   

df.groupby(["product"]).apply(merge_dates)

需要一些建议。任何帮助将不胜感激!

谢谢

【问题讨论】:

  • @BradSolomon 是的,“连续”意味着 start_ts 等于前一行的 end_ts。此外,还更新了描述中的条件。谢谢
  • @BradSolomon 更新了描述部分

标签: python pandas


【解决方案1】:

我相信这会奏效:

df.groupby(['product', (df.start_ts != df.end_ts.shift()).cumsum()], \
           as_index=False).agg({'start_ts':min, 'end_ts':max, 'value':sum})

#   product              end_ts            start_ts  value
# 0       a 2018-05-14 12:54:33 2018-05-14 10:54:33      2
# 1       a 2018-05-14 14:54:33 2018-05-14 13:54:33      1
# 2       b 2018-05-14 11:54:33 2018-05-14 10:54:33      1

此方法按产品分组,并按df.start_ts != df.end_ts.shift() 创建的布尔系列的cumsum 分组;布尔系列用作计数器,每当df.start_ts 不等于前一行的end_ts(即df.end_ts.shift())时,该计数器就会增加一,从而指示何时应该开始一个新组。

【讨论】:

  • 非常巧妙地使用.cumsum 来获取分组元素。
猜你喜欢
  • 2018-09-04
  • 2018-10-09
  • 2021-11-08
  • 2020-09-01
  • 1970-01-01
  • 2018-04-10
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多