首页 > 解决方案 > 用 Pandas 标记分组数据集中的最后一组行

问题描述

编辑:给出df.assign(Flag=1 - df.duplicated(['id', 'quarter', 'lot'], keep='last'))下面建议的方法,下面的问题

 index   mkid     ordernumber quarter lotnumber1 order_xldate  Flag
441670  10176228  0108595504  2015Q2    12947-1   2015-04-09     0
441211  10176228  0108663905  2015Q2    12947-1   2015-04-29     1
450008  10176228  0108663905  2015Q2     129161   2015-04-29     1
440268  10176228  0108779992  2015Q2    12987-1   2015-05-29     0
448187  10176228  0108779992  2015Q2    12848-1   2015-05-29     1
439085  10176228  0108895691  2015Q2    12987-1   2015-06-29     1
446123  10176228  0108895691  2015Q2    12965-1   2015-06-29     1
419419  10176228  0109003405  2015Q3    12969-1   2015-07-27     1
429893  10176228  0109003405  2015Q3    12987-1   2015-07-27     1
426850  10176228  0109241988  2015Q3      13929   2015-09-15     1
384762  10176228  0109385611  2015Q4     K10127   2015-10-09     1

Flag字段应用于给ordernumber定季度中的每个,而不是最后一个 ordernumber。所以,上面, for 2015Q2Flag应该只命中两行ordernumber 0108895691


之前的帖子

我目前有一个销售订单数据集,其中每个订单都ordernumber分为很多(即lot1lot2等)。因此,每个ordernumber. 其他相关列是帐户idquarter(即 2018 年第二季度)。对于每个给定id的每个给定quarter,我想使用 Pandas / Python 将一个标志应用于该给定季度内最后一个订单的所有批次。有什么建议吗?

目前有:

masterDF['FLAG'] = masterDF.groupby(by=['id','quarter'],as_index=False)['ordernumber'].nth(-1)
masterDF['LAST_ORDER_OF_QUARTER'] = np.where(masterDF['FLAG'].isnull(),0,1)

但这只会在该 ID/季度/订单组合的最后一行加上 1,而不是在该给定订单中的所有行上,如果该订单号出现在多行上。

我想要的输出是在两个批次上都有一个 1orderB

id   |   quarter   |   ordernumber   |   lot      |    Last Order of Quarter
----------------------------------------------------------------------------
A    |   2018Q1    |   orderA        |   lot1     |     0
A    |   2018Q1    |   orderB        |   lot1     |     1
A    |   2018Q1    |   orderB        |   lot2     |     1

代替:

id   |   quarter   |   ordernumber   |   lot      |    Last Order of Quarter
----------------------------------------------------------------------------
A    |   2018Q1    |   orderA        |   lot1     |     0
A    |   2018Q1    |   orderB        |   lot1     |     0
A    |   2018Q1    |   orderB        |   lot2     |     1

有什么建议吗?

标签: pythonpandas

解决方案


利用duplicated

df.assign(Flag=1 - df.duplicated(['id', 'quarter', 'lot'], keep='last'))

  id quarter ordernumber   lot  Flag
0  A  2018Q1      orderA  lot1     0
1  A  2018Q1      orderB  lot1     1
2  A  2018Q1      orderB  lot2     1

一样

df.assign(**{'Last Order': 1 - df.duplicated(['id', 'quarter', 'lot'], keep='last')})

  id quarter ordernumber   lot  Last Order
0  A  2018Q1      orderA  lot1           0
1  A  2018Q1      orderB  lot1           1
2  A  2018Q1      orderB  lot2           1

推荐阅读