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。这行吗?这和我现在拥有的有什么不同?我想idb
会有orderC
或orderD
…对不起,我没有意识到单独的id会有单独的订单。在上面的编辑中进行了澄清。我仍然得到ValueError:传递的项目数错误56,位置意味着1
--有什么建议吗?您可以共享一个小数据框来显示该错误吗?代码正在处理我的小型虚拟数据帧,但我可能缺少一些关于df的假设。