基于一列分组并获得其他列熊猫的唯一性和总和

我有这样的数据框:

id   product   department   price
1      x           a          5
2      y           b         10
1      z           b         15
3      z           a         2
2      x           a         1
1      x           a         1
4      w           b         10

现在我想使用 id 进行分组,并获取与它关联的列表中 product and department 的所有唯一值以及价格总和。

预期输出:

id   product   department   price
1    [x,z]      [a,b]      21
2    [x,y]      [a,b]      11
3    [z]         [a]         2
4    [w]         [b]         10

现在我可以进行 groupby 并从 3 中获取一列,但我不知道如何获取所有三列。

df.groupby(['id'])[product].unique()
hudaichen0603 回答:基于一列分组并获得其他列熊猫的唯一性和总和

使用带有 dict 定义的 agg() 的简单案例

import io

df = pd.read_csv(io.StringIO("""id   product   department   price
1      x           a          5
2      y           b         10
1      z           b         15
3      z           a         2
2      x           a         1
1      x           a         1
4      w           b         10"""),sep="\s+")

df.groupby("id").agg({"price":"sum","product":lambda s: s.unique().tolist(),"department":lambda s: s.unique().tolist()})

id 价格 产品 部门
1 21 ['x','z'] ['a','b']
2 11 ['y','x'] ['b','a']
3 2 ['z'] ['a']
4 10 ['w'] ['b']
,

id 上的 Groupby,在列上应用所需的聚合。对于唯一值,如果不需要保留顺序,则一种方法是 list(set(<sequence>))。如果您需要订单,那么您可以使用 x.unique().tolist() 而不是 list(set(x))

out = (df.groupby('id')
      .agg({'product': lambda x: list(set(x)),'department': lambda x: list(set(x)),'price': sum
            })
       )

输出:

   product department  price
id                          
1   [z,x]     [a,b]     21
2   [x,y]     [a,b]     11
3      [z]        [a]      2
4      [w]        [b]     10
,

要获得 productdepartment 的唯一值的排序列表(如您的预期结果所示),您可以将 np.unique() 与 {{ 3}},如下:

import numpy as np

df.groupby('id',as_index=False).agg(
    {'product': lambda x: np.unique(x).tolist(),'department': lambda x: np.unique(x).tolist(),'price': 'sum'})

结果:

   id product department  price
0   1  [x,z]     [a,b]     21
1   2  [x,b]     11
2   3     [z]        [a]      2
3   4     [w]        [b]     10
本文链接:https://www.f2er.com/13754.html

大家都在问