汇总列中每个唯一元素的最大和最小日期
Summarizing max and min dates for each unique element of a column
我有一个非常大的数据框,如下所示:
Col1 StartDate EndDate
A 4/5/2021 4/5/2021
A 4/6/2021 4/6/2021
A 4/11/2021 4/11/2021
B 10/25/2020 10/25/2020
B 10/26/2020 10/27/2020
我需要得到以下信息:
Col1 StartDate EndDate
A 4/5/2021 4/6/2021
A 4/11/2021 4/11/2021
B 10/25/2020 10/27/2020
对于 Col1
的每个唯一元素,我获取最大连续天数,并使用这些连续天数的最大和最小值来创建新的 StartDate
和 EndDate
列。
我不知道该怎么做。
使用 diff
dt.days
of StartDate
, ne
and cumsum
作为您的 groupby 键来获取连续几天的连续组:
# If required - cast StartDate & EndaDate to datetime dtype
df['StartDate'] = pd.to_datetime(df['StartDate'])
df['EndDate'] = pd.to_datetime(df['EndDate'])
(df.groupby(df['StartDate'].diff().dt.days.ne(1).cumsum())
.agg({'Col1':'first','StartDate':'min', 'EndDate':'max'}))
[出局]
Col1 StartDate EndDate
StartDate
1 A 2021-04-05 2021-04-06
2 A 2021-04-11 2021-04-11
3 B 2020-10-25 2020-10-27
说明
df['StartDate'].diff().dt.days
returns 与上一行的天数差异(对于日期而言是 timedelta):
0 NaN
1 1.0
2 5.0
3 -168.0
4 1.0
Name: StartDate, dtype: float64
.ne(1)
只是一个布尔值 - “不等于”1
:
0 True
1 False
2 True
3 True
4 False
Name: StartDate, dtype: bool
最后,.cumsum()
是这个布尔值的累加和 Series
,每个“组”由连续的天组成:
0 1
1 1
2 2
3 3
4 3
Name: StartDate, dtype: int32
更新
运行 删除最后一行:
我有一个非常大的数据框,如下所示:
Col1 StartDate EndDate
A 4/5/2021 4/5/2021
A 4/6/2021 4/6/2021
A 4/11/2021 4/11/2021
B 10/25/2020 10/25/2020
B 10/26/2020 10/27/2020
我需要得到以下信息:
Col1 StartDate EndDate
A 4/5/2021 4/6/2021
A 4/11/2021 4/11/2021
B 10/25/2020 10/27/2020
对于 Col1
的每个唯一元素,我获取最大连续天数,并使用这些连续天数的最大和最小值来创建新的 StartDate
和 EndDate
列。
我不知道该怎么做。
使用 diff
dt.days
of StartDate
, ne
and cumsum
作为您的 groupby 键来获取连续几天的连续组:
# If required - cast StartDate & EndaDate to datetime dtype
df['StartDate'] = pd.to_datetime(df['StartDate'])
df['EndDate'] = pd.to_datetime(df['EndDate'])
(df.groupby(df['StartDate'].diff().dt.days.ne(1).cumsum())
.agg({'Col1':'first','StartDate':'min', 'EndDate':'max'}))
[出局]
Col1 StartDate EndDate
StartDate
1 A 2021-04-05 2021-04-06
2 A 2021-04-11 2021-04-11
3 B 2020-10-25 2020-10-27
说明
df['StartDate'].diff().dt.days
returns 与上一行的天数差异(对于日期而言是 timedelta):
0 NaN
1 1.0
2 5.0
3 -168.0
4 1.0
Name: StartDate, dtype: float64
.ne(1)
只是一个布尔值 - “不等于”1
:
0 True
1 False
2 True
3 True
4 False
Name: StartDate, dtype: bool
最后,.cumsum()
是这个布尔值的累加和 Series
,每个“组”由连续的天组成:
0 1
1 1
2 2
3 3
4 3
Name: StartDate, dtype: int32
更新
运行 删除最后一行: