我有一个 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:00
到 2020-01-14 07:00:00 的范围
。使用 pandas,我如何分组/聚合具有相同标签的连续行,并采用最小 start
和最大 end
来组合具有相同标签的连续日期范围?
最佳答案
首先,我们使用 Series.shift
和 Series.cumsum
为每个连续的 label
值制作一个组指示器。
然后我们将 groupby.agg
与 min
和 max
一起使用。
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/