【问题标题】:Select the previous row of a certain value in a column选择列中某个值的上一行
【发布时间】:2022-01-07 07:57:27
【问题描述】:

我的库存数据包含以下列:sale_datesaleIDregionproduct。每个product 中的每个region 都可以在该region 内多次出售,但每次都有一个唯一的saleID

现在,我有一个saleID 的列表,我需要选择saleID 所在的行。此外,我需要找到该产品在该地区的最后一个saleID(以及整行)。也就是说,我需要先按regionproduct分组,然后在列表中找到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


    【解决方案1】:

    使用DataFrameGroupBy.shift 作为助手Series 并在Series.isin 中使用原始掩码测试它,测试列saleID| 按位链接OR

    saleID_list = ["B21", "E11", "I14"]
    
    s = df.groupby(['region', 'product'])['saleID'].shift(-1)
    
    df = df[df['saleID'].isin(saleID_list) | s.isin(saleID_list)]
    print (df)
        sale_date saleID  region product
    0  2017-05-01    A12    Asia    car1
    1  2018-03-05    B21    Asia    car1
    3  2018-09-06    C21  Canada    car2
    4  2019-01-01    E11  Canada    car2
    7  2015-02-02    H11  Mexico    car4
    8  2015-02-03    I14  Mexico    car4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 2014-05-27
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      相关资源
      最近更新 更多