gpt4 book ai didi

python - Pandas Dataframe - 具有条件/行迭代/上一行计算的最小函数

转载 作者:太空宇宙 更新时间:2023-11-03 14:46:19 28 4
gpt4 key购买 nike

我有一个数据框,其中包含一些记录的开始和结束日期:

import pandas as pd

df = pd.DataFrame({'Key': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B' ],
'StartDate': ['01/01/2015', '01/01/2016', '06/01/2016','10/01/2017',
'01/01/2015', '01/01/2016', '07/15/2016','10/01/2017'],
'EndDate': ['12/30/2015', '05/31/2016', '09/30/2017', '12/31/2018',
'12/30/2015', '05/31/2016', '09/30/2017', '12/31/2018']})
df = df[['Key', 'StartDate', 'EndDate']]

print(df)

我的输出看起来像这样:

 Key   StartDate     EndDate
0 A 01/01/2015 12/30/2015
1 A 01/01/2016 05/31/2016
2 A 06/01/2016 09/30/2017
3 A 10/01/2017 12/31/2018
4 B 01/01/2015 12/30/2015
5 B 01/01/2016 05/31/2016
6 B 07/15/2016 09/30/2017
7 B 10/01/2017 12/31/2018

我需要知道每个 key 的最早开始日期和最晚结束日期。我这样做了(如果有更好的方法,请告诉我):

df_start = df.groupby('Key')['StartDate'].min().reset_index(name = 'StartDate')
df_end = df.groupby('Key')['EndDate'].max().reset_index(name = 'EndDate')

final = pd.merge(df_start, df_end, on = 'Key', how = 'left')
print(final)

这给了我这个输出:

  Key   StartDate     EndDate
0 A 01/01/2015 12/31/2018
1 B 01/01/2015 12/31/2018

现在,如果您查看原始数据框中的键“B”,您会看到第 5 行的结束日期是 05/31/2016,第 6 行的开始日期是 07/15/2016,所以这些记录不是连续的。有 1.5 个月的日期中断。如果日期中断超过 3 天,我只需要返回连续记录的最早开始日期,因此在这种情况下,所需的输出将是:

Key   StartDate     EndDate
0 A 01/01/2015 12/31/2018
1 B 07/15/2016 12/31/2018

我一直在尝试使用“shift”方法来计算每一行的开始日期和前一行的结束日期之间的天数,但不确定我是否完全朝着正确的方向前进。 . 或者我应该遍历行?我的数据框中有数十万条记录。

完成此任务的最有效方法是什么?谢谢。

最佳答案

好的,您需要为定义的连续记录创建一个标记,然后分组并删除重复项:

df['StartDate'] = pd.to_datetime(df['StartDate'])

df['EndDate'] = pd.to_datetime(df['EndDate'])

consec = (df.groupby('Key').apply(lambda x: x.StartDate - x.EndDate.shift(1) >= pd.Timedelta('3 day'))
.cumsum().reset_index(drop=True))

(df.groupby(['Key',consec])
.agg({'StartDate':'min','EndDate':'max'})
.reset_index()
.drop_duplicates('Key', keep='last')
.drop('level_1', axis=1))

输出:

  Key  StartDate    EndDate
0 A 2015-01-01 2018-12-31
2 B 2016-07-15 2018-12-31

关于python - Pandas Dataframe - 具有条件/行迭代/上一行计算的最小函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49000384/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com