Python 使用熊猫标记分组数据集中的最后一组行

Python 使用熊猫标记分组数据集中的最后一组行,python,pandas,Python,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

编辑:鉴于下面建议的
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
标志
字段应用于给定季度的每个
订单号
,而不是上一个
订单号
。因此,如上所述,对于
2015Q2
标志
应该只针对
订单号0108895691


以前的帖子

我目前有一个销售订单数据集,其中每个
ordernumber
被分成若干批次(即
lot1
lot2
,等等)。因此,每个
订单号可能有不同的行。其他相关列为账户
id
季度
(即2018Q2)。对于每个给定的
季度中的每个给定
id
,我想使用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/quarter/order组合的最后一行上加1,如果ordernumber出现在多行上,则不会在给定订单内的所有行上加1

我想要的输出是在两批
orderB

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

有什么建议吗?

使用重复的

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

groupby对象提供了一个方便的表,可以将其合并回主表中。将该表上的“Last Order”指定给1,将其合并到main,并用0填充NaN

new = df.groupby(['id', 'quarter']).nth(-1)
del new['lot']
new['Last Order'] = 1
df = pd.merge(df, new, how='left').fillna(0)
这使得:

    id  quarter ordernumber lot value
0   a   2018Q1  orderA  lot1    0.0
1   a   2018Q1  orderA  lot2    0.0
2   a   2018Q1  orderB  lot1    1.0
3   b   2018Q1  orderC  lot2    0.0
4   b   2018Q1  orderD  lot1    1.0
5   b   2018Q1  orderD  lot2    1.0

抱歉:我希望
orderB
lot1
lot2
上的最后一个订单标志都是1:看起来这与我现在拥有的一致,并且只将1放在最后一行,而不是前一行。不要认为这有效:获得了
值错误:传递的项目数错误57,放置意味着1
当我放入时:
masterDF['TEMP\u COL\u id']=masterDF.assign(**{'Last Order':1-masterDF.duplicated(['id','quarter','lot'],keep='Last'))
assign返回一个数据帧。您试图将整个数据帧填充到一列中。只需执行masterDF=我编写的任何操作。我不认为这样做有效,它仍然会在每个订单的最后一行中输入1,而不管它是否是本季度的最后一个订单。所以,在上面的例子中,在这个代码中,订单A得到了1。这行吗?这和我现在拥有的有什么不同?我想id
b
会有
orderC
orderD
…对不起,我没有意识到单独的id会有单独的订单。在上面的编辑中进行了澄清。我仍然得到
ValueError:传递的项目数错误56,位置意味着1
--有什么建议吗?您可以共享一个小数据框来显示该错误吗?代码正在处理我的小型虚拟数据帧,但我可能缺少一些关于df的假设。