如何用Pandas按JOB分组拆分STATUS列并拼接PART字段
Pandas分组拆分STATUS列并拼接PART字段的解决方案
方法一:交叉表+分组拼接(简洁直观)
利用pd.crosstab快速生成STATUS对应的布尔列,再单独处理PART字段的拼接,最后合并结果:
import pandas as pd # 初始化原始数据 work = pd.DataFrame({ "JOB": ['JOB01', 'JOB01', 'JOB02', 'JOB02', 'JOB03', 'JOB03'], "STATUS": ['ON_ORDER', 'ACTIVE','TO_BE_ALLOCATED', 'ON_ORDER', 'ACTIVE','TO_BE_ALLOCATED'], "PART": ['PART01', 'PART02','PART03','PART04','PART05','PART06'] }) # 1. 生成STATUS对应的布尔列:每个JOB是否包含该STATUS status_bool = pd.crosstab(work['JOB'], work['STATUS']).astype(bool) # 2. 按JOB拼接PART字段,用换行符分隔 part_concat = work.groupby('JOB')['PART'].agg('\n'.join).rename('PART_CON') # 3. 合并两个结果集 result = status_bool.join(part_concat).reset_index() # 查看输出 print(result.to_string(index=False))
方法二:分组聚合一次性完成
通过自定义聚合函数,在一次groupby.agg操作中完成所有需求:
import pandas as pd # 初始化原始数据 work = pd.DataFrame({ "JOB": ['JOB01', 'JOB01', 'JOB02', 'JOB02', 'JOB03', 'JOB03'], "STATUS": ['ON_ORDER', 'ACTIVE','TO_BE_ALLOCATED', 'ON_ORDER', 'ACTIVE','TO_BE_ALLOCATED'], "PART": ['PART01', 'PART02','PART03','PART04','PART05','PART06'] }) # 获取所有唯一的STATUS值 status_list = work['STATUS'].unique() # 定义聚合规则:每个STATUS列判断是否存在,PART列拼接 agg_rules = { **{status: lambda x: status in x.values for status in status_list}, 'PART_CON': ('PART', lambda x: '\n'.join(x)) } # 分组聚合 result = work.groupby('JOB').agg(**agg_rules).reset_index() # 查看输出 print(result.to_string(index=False))
输出结果
两种方法都能得到符合要求的输出:
JOB ON_ORDER ACTIVE TO_BE_ALLOCATED PART_CON JOB01 True True False PART01\nPART02 JOB02 True False True PART03\nPART04 JOB03 False True True PART05\nPART06
内容的提问来源于stack exchange,提问作者Martin Cronje
相关产品推荐
相关产品推荐

