ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-25 09:55:36  阅读:160  来源: 互联网

标签:pandas loops iteration min python


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

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

我需要知道每个键的最早开始日期和最晚结束日期.
我做到了(请让我知道是否有更好的方法可以做到这一点):

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行的结束日期是2016年5月31日,第6行的开始日期是2016年7月15日,因此这些记录是不连续.日期间隔为1.5个月.如果日期中断超过3天,则仅需要返回连续记录的最早开始日期,因此在这种情况下,所需的输出将是:

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

我一直在尝试使用“ shift”方法来计算每行的开始日期和上一行的结束日期之间的天数,但是不确定我是否朝着正确的方向前进.我要遍历行吗?我的数据框中有成千上万的记录.

最有效的方法是什么?谢谢.

解决方法:

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

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

标签:pandas,loops,iteration,min,python
来源: https://codeday.me/bug/20191025/1927816.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有