在两个id上对Pandas中的重复项进行分组,并以不同的方式转换其余列

2024-09-28 20:47:18 发布

您现在位置:Python中文网/ 问答频道 /正文

为了这个问题,假设我们有两个商店和一个有重复条目的熊猫库存。我们在每个商品的条形码上标明其到达商店的日期(因此,如果日期不同,即使条形码相同,我们也会考虑不同的商品),我们在每个商店存储每个商品的库存,以及价格:

      arrival_date   bar_code   stock_shop1   stock_shop2   price
1       2015-08-30    8000001            52            11     100
2       2015-08-30    8000001            48             0      85
3       2015-09-11    8000001            10            20      95
4       2015-10-04    8000002             5            10      50
5       2015-10-04    8000002            30            25      49

我们要根据到达日期和条形码进行分组,并且:

  1. 把每家商店的存货加起来
  2. 设定最低价格(我们正在销售,希望两家店的报价相同)

所以我们应该得到:

      arrival_date   bar_code   stock_shop1   stock_shop2   price
1       2015-08-30    8000001           100            11      85
2       2015-09-11    8000001            10            20      95
3       2015-10-04    8000002            35            35      49

我见过几个类似的问题,即使有两个ID,但我没有发现是否可以对某些列求和,并在其他列中保持最大值或最小值。我想这是可能的,我只是不知道怎么做

我试过:

df.join(df.groupby(['arrival_date', 'bar_code'])(['stock_shop1', 'stock_shop2']).sum(), on=['arrival_date', 'bar_code'], rsuffix='_r')

只是为了检查是否可以至少按“到达日期”和“条形码”分组,并对股票列求和,但我得到了错误:

TypeError: 'DataFrameGroupBy' obejct is not callable

有什么帮助吗


Tags: 目的dfdatestock库存barcode价格
2条回答

代码的问题是,您试图将Groupby object调用为-df.groupby(['arrival_date', 'bar_code'])(..),因此出现了问题

您也不需要使用DataFrame.join,只需对多列使用groupby,然后使用.aggregate()(或.agg())。示例-

df.groupby(['arrival_date', 'bar_code']).agg({'stock_shop1':sum,'stock_shop2':sum,'price':min})

如果不希望'arrival_date''bar_code'作为索引,可以调用.reset_index()来重置索引。示例-

df.groupby(['arrival_date', 'bar_code']).agg({'stock_shop1':sum,'stock_shop2':sum,'price':min}).reset_index()

演示-

In [14]: df
Out[14]:
  arrival_date  bar_code  stock_shop1  stock_shop2  price
1   2015-08-30   8000001           52           11    100
2   2015-08-30   8000001           48            0     85
3   2015-09-11   8000001           10           20     95
4   2015-10-04   8000002            5           10     50
5   2015-10-04   8000002           30           25     49

In [15]: df.groupby(['arrival_date', 'bar_code']).agg({'stock_shop1':sum,'stock_shop2':sum,'price':min})
Out[15]:
                       stock_shop2  stock_shop1  price
arrival_date bar_code
2015-08-30   8000001            11          100     85
2015-09-11   8000001            20           10     95
2015-10-04   8000002            35           35     49

In [16]: df.groupby(['arrival_date', 'bar_code']).agg({'stock_shop1':sum,'stock_shop2':sum,'price':min}).reset_index()
Out[16]:
  arrival_date  bar_code  stock_shop2  stock_shop1  price
0   2015-08-30   8000001           11          100     85
1   2015-09-11   8000001           20           10     95
2   2015-10-04   8000002           35           35     49

是的,您可以这样做,在agg中您可以提到哪些聚合规则不能应用于每个列

In [121]: (df.groupby(['arrival_date', 'bar_code'])
             .agg({'stock_shop1': np.sum, 'stock_shop2': np.sum, 'price': np.min})
           )
Out[121]:
                       price  stock_shop1  stock_shop2
arrival_date bar_code
2015-08-30   8000001      85          100           11
2015-09-11   8000001      95           10           20
2015-10-04   8000002      49           35           35

相关问题 更多 >