加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何使用groupby来避免python中的循环

发布时间:2020-12-16 21:33:12 所属栏目:Python 来源:网络整理
导读:数据中有几列,其中三列名为“candidate_id”,“enddate”,“TitleLevel”. 在同一个id中,如果enddate相同,我将删除较低级别的记录. 例如,给定: candidate_id startdate enddate TitleLevel 1 2012.1.1 2013.5.1 2 1 2011.1.1 2013.5.1 4 1 2008.12.1 2010.1
数据中有几列,其中三列名为“candidate_id”,“enddate”,“TitleLevel”.

在同一个id中,如果enddate相同,我将删除较低级别的记录.

例如,给定:

candidate_id   startdate     enddate   TitleLevel
    1          2012.1.1      2013.5.1     2
    1          2011.1.1      2013.5.1     4
    1          2008.12.1     2010.1.1     3
    2          2010.10.1     2012.12.1    2

我想要的是:

candidate_id   startdate     enddate   TitleLevel
    1          2011.1.1      2013.5.1     4
    1          2008.12.1     2010.1.1     3
    2          2010.10.1     2012.12.1    2

我将删除candidate_id = 1,enddate = 2013.5.1和titlelevel = 2.

我想出了一个循环.

for i in range(nrow-2,-1,-1):
    if (JobData['enddate'][i] == JobData['enddate'][i+1] 
           and JobData['candidate_id'][i] == JobData['candidate_id'][i+1] 
           and pd.notnull(JobData['enddate'][i]):
        if JobData['TitleLevel'][i] > JobData['TitleLevel'][i+1]:
            JobData= JobData.drop(i+1)
        else:
            JobData= JobData.drop(i)

循环确实需要一些时间来删除冗余行.有更快的方法吗?

解决方法

如果数据结构与您描述的完全一致,则可以使用groupby / max:
>>> df
   candidate_id    enddate  TitleLevel
0             1   2013.5.1           2
1             1   2013.5.1           4
2             1   2010.1.1           3
3             2  2012.12.1           2
>>> df.groupby(['candidate_id','enddate']).max().reset_index()
   candidate_id    enddate  TitleLevel
0             1   2010.1.1           3
1             1   2013.5.1           4
2             2  2012.12.1           2

这里groupby对具有相等candidate_id和enddate的行进行分组,max()计算每个组中的最大TitleLevel.结果与删除所有其他值的行相同.

如果您有更多列,

>>> df
   candidate_id    enddate  TitleLevel other_column
0             1   2013.5.1           2          foo
1             1   2013.5.1           4          bar
2             1   2010.1.1           3       foobar
3             2  2012.12.1           2       barfoo

您可以获取具有最大值的行的idex,而不必排序是否必须保留行顺序:

>>> idx = df.groupby(['candidate_id','enddate'],sort=False)['TitleLevel'].agg(lambda x: x.idxmax())

并使用ix过滤所需的行:

>>> df.ix[idx]
   candidate_id    enddate  TitleLevel other_column
1             1   2013.5.1           4          bar
2             1   2010.1.1           3       foobar
3             2  2012.12.1           2       barfoo

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读