如何遍历DataFrame,将同商品总数量归集至首个出现的门店?
实现商品数量归集到首次出现门店的方法
示例数据
先构造一个符合场景的DataFrame用于演示:
import pandas as pd data = { 'Store': ['A', 'B', 'A', 'C', 'B'], 'Item': ['Fish', 'Fish', 'Beef', 'Beef', 'Chicken'], 'Qty': [10, 6, 8, 5, 3] } df = pd.DataFrame(data)
方法一:保留所有行,仅首次出现的门店显示总数量
这种方式保留原DataFrame的所有行,但仅每个商品首次出现的门店行显示总数量,其余同商品行的数量设为0:
# 1. 计算每个商品的总数量 item_totals = df.groupby('Item')['Qty'].sum() # 2. 标记每个商品的首次出现行 df['is_first'] = ~df.duplicated('Item', keep='first') # 3. 更新数量:首次行用总数量,其他行设为0 df['Qty'] = df.apply(lambda row: item_totals[row['Item']] if row['is_first'] else 0, axis=1) # 可选:删除标记列 df = df.drop('is_first', axis=1)
执行后结果:
| Store | Item | Qty |
|---|---|---|
| A | Fish | 16 |
| B | Fish | 0 |
| A | Beef | 13 |
| C | Beef | 0 |
| B | Chicken | 3 |
方法二:仅保留每个商品首次出现的门店行,数量替换为总和
如果不需要保留多余行,只保留每个商品首次出现的门店,并将数量更新为该商品的总数量:
# 1. 计算每个商品的总数量 item_totals = df.groupby('Item')['Qty'].sum() # 2. 获取每个商品首次出现的行(保留原顺序) result_df = df.groupby('Item').head(1).copy() # 3. 将数量替换为总数量 result_df['Qty'] = result_df['Item'].map(item_totals)
执行后结果:
| Store | Item | Qty |
|---|---|---|
| A | Fish | 16 |
| A | Beef | 13 |
| B | Chicken | 3 |
关键说明
- 两种方法都依赖原DataFrame的顺序判断“首次出现”,不要提前排序,否则会改变首次出现的门店。
duplicated('Item', keep='first')标记除首次出现外的所有重复商品行,取反后即为首次出现的行。groupby('Item').head(1)直接提取每个商品在原DataFrame中第一次出现的行。
内容的提问来源于stack exchange,提问作者Leonardo Nascimento
相关产品推荐
相关产品推荐

