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

时间:2021-07-29 19:29:53

标签: python pandas group-by

我有这样的数据框:

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()

3 个答案:

答案 0 :(得分:1)

使用带有 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']

答案 1 :(得分:0)

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

答案 2 :(得分:0)

要获得 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, y]     [a, b]     11
2   3     [z]        [a]      2
3   4     [w]        [b]     10
相关问题