You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:07:15