如何对排序后的DataFrame按sku分组,拼接bill并求和qty_left?
问题:按SKU分组聚合DataFrame,实现Bill去重拼接和Qty求和
我有一个已排序的DataFrame dfsorted,代码如下:
dfsorted = df.sort_values(["sku"], ascending=[True]) print(dfsorted.head())
其前几行数据如下:
| id | sku | bill | qty_left |
|---|---|---|---|
| 186 | 01-04 | 50469 | 0 |
| 16 | 01-20 | 50262 | 15 |
| 267 | 01-20 | 50460 | 1 |
| 18 | 01-20 | 50262 | 5 |
| 17 | 01-20 | 50262 | 5 |
希望将其聚合为如下结果:
| sku | bill | qty_left |
|---|---|---|
| 01-04 | 50469 | 0 |
| 01-20 | 50262, 50460 | 26 |
具体需求:
- 按
sku对DataFrame进行分组 - 每个
sku对应的bill值去重后拼接 - 每个
sku对应的qty_left值求和
解决方案
直接使用groupby结合agg方法,为不同列指定对应的聚合逻辑即可:
# 定义各列的聚合规则 agg_rules = { 'bill': lambda x: ', '.join(x.unique()), # 去重后拼接成字符串 'qty_left': 'sum' # 直接求和 } # 执行分组聚合 agg_result = dfsorted.groupby('sku', as_index=False).agg(agg_rules) # 输出结果 print(agg_result)
说明
groupby('sku', as_index=False):按sku列分组,as_index=False确保sku作为结果中的普通列,而非索引bill列的处理:x.unique()先提取该分组下的唯一bill值,再用,拼接成字符串;如果需要固定拼接顺序,可以加上sorted(),即lambda x: ', '.join(sorted(x.unique()))qty_left列直接使用sum方法求和,符合需求
内容的提问来源于stack exchange,提问作者user1692094
相关产品推荐
相关产品推荐

