繁体   English   中英

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

[英]Group BY based on one column and get unique and sum of other columns pandas

我有这样的数据框:

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

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

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'] ['一种']
4 10 ['w'] ['b']

Groupby on id ,在列上应用所需的聚合。 对于唯一值,如果不需要保留顺序,则一种方法是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()GroupBy.agg()一起使用,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM