[英]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
要获得product
和department
的唯一值的排序列表(如您的预期结果所示),您可以将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.