【发布时间】:2022-01-07 07:57:27
【问题描述】:
我的库存数据包含以下列:sale_date、saleID、region、product。每个product 中的每个region 都可以在该region 内多次出售,但每次都有一个唯一的saleID。
现在,我有一个saleID 的列表,我需要选择saleID 所在的行。此外,我需要找到该产品在该地区的最后一个saleID(以及整行)。也就是说,我需要先按region和product分组,然后在列表中找到saleID,在分组的行中找到这个saleID的上一行
df
sale_date saleID region product
2017-05-01 A12 Asia car1
2018-03-05 B21 Asia car1
2018-04-01 C23 Asia car1
2018-09-06 C21 Canada car2
2019-01-01 E11 Canada car2
2019-03-02 E23 USA car3
2019-01-02 G41 USA car3
2015-02-02 H11 Mexico car4
2015-02-03 I14 Mexico car4
预期输出
saleID_list = [B21, E11, I14]
sale_date saleID region product
2017-05-01 A12 Asia car1
2018-03-05 B21 Asia car1
2018-09-06 C21 Canada car2
2019-01-01 E11 Canada car2
2015-02-02 H11 Mexico car4
2015-02-03 I14 Mexico car4
我知道我们可以使用列出的saleID 选择行
df.loc[df['saleID'].isin(saleID_list)]
但是我可以找到 groupby 数据的上一行吗?我试图写一些类似使用shift的东西,但是AttributeError: 'DataFrameGroupBy' object has no attribute 'loc'
df.groupby(['region', 'product']).loc[df['saleID'].isin(saleID_list)].shift(1)
【问题讨论】:
标签: python pandas select group-by concatenation