django - Pandas -分组和聚合列中具有相同值的连续行

标签 django pandas dataframe pandas-groupby aggregation

我有一个 pandas DataFrame,来自从数据库中提取的一长串日期时间范围,每个范围都有一个标签。日期的顺序是一行的开始日期是前一行的结束日期。一个可行的例子在这里:

import pandas as pd

bins = [{'start': '2020-01-12 00:00:00', 'end': '2020-01-13 00:00:00', 'label': 't3'},
        {'start': '2020-01-13 00:00:00', 'end': '2020-01-13 07:00:00', 'label': 't2'},
        {'start': '2020-01-13 07:00:00', 'end': '2020-01-13 15:30:00', 'label': 't1'},
        {'start': '2020-01-13 15:30:00', 'end': '2020-01-14 00:00:00', 'label': 't2'},
        {'start': '2020-01-14 00:00:00', 'end': '2020-01-14 07:00:00', 'label': 't2'},
        {'start': '2020-01-14 07:00:00', 'end': '2020-01-14 15:30:00', 'label': 't1'},
        {'start': '2020-01-14 15:30:00', 'end': '2020-01-15 00:00:00', 'label': 't2'},
        {'start': '2020-01-15 00:00:00', 'end': '2020-01-15 07:00:00', 'label': 't2'},
        {'start': '2020-01-15 07:00:00', 'end': '2020-01-15 15:30:00', 'label': 't1'},
        {'start': '2020-01-15 15:30:00', 'end': '2020-01-16 00:00:00', 'label': 't2'},
        {'start': '2020-01-16 00:00:00', 'end': '2020-01-16 07:00:00', 'label': 't2'},
        {'start': '2020-01-16 07:00:00', 'end': '2020-01-16 15:30:00', 'label': 't1'},
        {'start': '2020-01-16 15:30:00', 'end': '2020-01-17 00:00:00', 'label': 't2'},
        {'start': '2020-01-17 00:00:00', 'end': '2020-01-17 07:00:00', 'label': 't2'},
        {'start': '2020-01-17 07:00:00', 'end': '2020-01-17 15:30:00', 'label': 't1'},
        {'start': '2020-01-17 15:30:00', 'end': '2020-01-18 00:00:00', 'label': 't2'},
        {'start': '2020-01-18 00:00:00', 'end': '2020-01-19 00:00:00', 'label': 't2'}]
bins_df = pd.DataFrame(bins)

请注意,某些标签是连续重复的,例如第 4 行和第 5 行具有相同的标签。因此,标签 't2' 适用于从 2020-01-13 15:30:002020-01-14 07:00:00 的范围。使用 pandas,我如何分组/聚合具有相同标签的连续行,并采用最小 start 和最大 end 来组合具有相同标签的连续日期范围?

最佳答案

首先,我们使用 Series.shiftSeries.cumsum 为每个连续的 label 值制作一个组指示器。

然后我们将 groupby.aggminmax 一起使用。

label_groups = bins_df['label'].ne(bins_df['label'].shift()).cumsum()

df = (
    bins_df.groupby(label_groups).agg({'start':'min', 'end':'max', 'label':'first'})
           .reset_index(drop=True)
)
                 start                 end label
0  2020-01-12 00:00:00 2020-01-13 00:00:00    t3
1  2020-01-13 00:00:00 2020-01-13 07:00:00    t2
2  2020-01-13 07:00:00 2020-01-13 15:30:00    t1
3  2020-01-13 15:30:00 2020-01-14 07:00:00    t2
4  2020-01-14 07:00:00 2020-01-14 15:30:00    t1
5  2020-01-14 15:30:00 2020-01-15 07:00:00    t2
6  2020-01-15 07:00:00 2020-01-15 15:30:00    t1
7  2020-01-15 15:30:00 2020-01-16 07:00:00    t2
8  2020-01-16 07:00:00 2020-01-16 15:30:00    t1
9  2020-01-16 15:30:00 2020-01-17 07:00:00    t2
10 2020-01-17 07:00:00 2020-01-17 15:30:00    t1
11 2020-01-17 15:30:00 2020-01-19 00:00:00    t2

关于django - Pandas -分组和聚合列中具有相同值的连续行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59778744/

相关文章:

python - 在 Pandas 数据框中用 NaN 替换空列表

python - 在python pandas的循环中合并大数据框中的许多子数据框

python - 根据 2 个条件替换 Df 中的值

python - 在 Python 中自动比较 Winmerge

django - 在 django-react-redux 中 PUT 文件请求

mysql - 海量记录的bulk_create最佳实践

python - Django,ImportError : cannot import name Celery, 可能的循环导入?

python - 反转数据框列的顺序

python - pandas 中数据框的聚合函数

python - 一一获取查询集数据