如何根据Series标记合并DataFrame中指定型号的行
Pandas 按标记合并指定型号行并求和
原始数据
DataFrame(df1)
包含型号、部件及数量信息,定义代码:
import pandas as pd df1 = pd.DataFrame({'model':['A','A','A','B','B','C','C','C','D','D'], 'part':['ax','ay','az','bx','by','cx','cy','cz','dx','dy'], 'qty':[1,2,3,2,4,2,5,3,1,2]})
数据结构如下:
| model | part | qty |
|---|---|---|
| A | ax | 1 |
| A | ay | 2 |
| A | az | 3 |
| B | bx | 2 |
| B | by | 4 |
| C | cx | 2 |
| C | cy | 5 |
| C | cz | 3 |
| D | dx | 1 |
| D | dy | 2 |
Series(s1)
记录各型号是否允许合并:on表示可合并,off表示不可合并,定义代码:
s1 = pd.Series({'A':'on', 'B':'off','C':'off','D':'on'})
对应关系如下:
| model | 合并标记 |
|---|---|
| A | on |
| B | off |
| C | off |
| D | on |
需求
保留标记为off的型号行不变,将标记为on的型号行合并:同一型号的part用逗号拼接,qty列求和,预期结果:
| model | part | qty |
|---|---|---|
| A | ax,ay,az | 6 |
| B | bx | 2 |
| B | by | 4 |
| C | cx | 2 |
| C | cy | 5 |
| C | cz | 3 |
| D | dx,dy | 3 |
实现方案
完整代码
import pandas as pd # 初始化原始数据 df1 = pd.DataFrame({'model':['A','A','A','B','B','C','C','C','D','D'], 'part':['ax','ay','az','bx','by','cx','cy','cz','dx','dy'], 'qty':[1,2,3,2,4,2,5,3,1,2]}) s1 = pd.Series({'A':'on', 'B':'off','C':'off','D':'on'}).rename('merge_flag').reset_index().rename(columns={'index':'model'}) # 给df1添加合并标记列 df_with_flag = df1.merge(s1, on='model', how='left') # 处理不可合并的行:直接保留原结构 df_no_merge = df_with_flag[df_with_flag['merge_flag'] == 'off'].drop('merge_flag', axis=1) # 处理可合并的行:按型号分组,拼接部件、求和数量 df_merge = df_with_flag[df_with_flag['merge_flag'] == 'on'].groupby('model').agg( part=('part', ','.join), qty=('qty', 'sum') ).reset_index() # 合并结果并按型号排序 final_result = pd.concat([df_merge, df_no_merge], ignore_index=True).sort_values('model').reset_index(drop=True) print(final_result)
代码说明
- 关联标记列:将Series s1转换为DataFrame格式,通过
merge把合并标记关联到df1的每一行 - 拆分处理:
- 筛选出标记为
off的行,直接去除标记列后保留原始结构 - 对标记为
on的行按model分组,用','.join拼接同型号的部件名称,用sum计算数量总和
- 筛选出标记为
- 合并结果:将两组数据合并后按型号排序,得到最终符合需求的DataFrame
内容的提问来源于stack exchange,提问作者ghost_like
相关产品推荐
相关产品推荐

