我有这样的数据框:
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()
答案 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)
要获得 product
和 department
的唯一值的排序列表(如您的预期结果所示),您可以将 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