如何在DataFrame中新增列统计各分类出现次数及对应工单?
解决方案
可以通过自定义函数结合pandas.DataFrame.apply()实现需求,具体代码如下:
1. 构造示例DataFrame
import pandas as pd data = { 'key': ['CNI-1', 'CNI-2', 'CNI-3', 'CNI-4', 'CNI-5'], 'ticket_id': ['T1', 'T2, T3', 'T1, T4', 'T4, T5, T6, T7', 'T1, T8, T9, T10'], 'ticket_category': ['Reset', 'Reset, Error', 'Reset, Server', 'Server, Server, Server, Error', 'Reset, Reset, Error, Server'] } df = pd.DataFrame(data)
2. 定义处理函数并生成目标列
def combine_category_info(row): # 拆分并清洗工单ID和分类列表 tickets = [t.strip() for t in row['ticket_id'].split(',')] categories = [c.strip() for c in row['ticket_category'].split(',')] # 按分类分组归集工单ID cat_ticket_map = {} for cat, ticket in zip(categories, tickets): cat_ticket_map.setdefault(cat, []).append(ticket) # 生成指定格式的字符串片段并拼接 result_parts = [] for category, ticket_list in cat_ticket_map.items(): count = len(ticket_list) ticket_str = ', '.join(ticket_list) result_parts.append(f"{category} - {count}({ticket_str})") return ', '.join(result_parts) # 新增combined列 df['combined'] = df.apply(combine_category_info, axis=1)
3. 查看结果
运行后df的输出与期望一致:
key ticket_id ticket_category combined 0 CNI-1 T1 Reset Reset - 1(T1) 1 CNI-2 T2, T3 Reset, Error Reset - 1(T2), Error - 1(T3) 2 CNI-3 T1, T4 Reset, Server Reset - 1(T1), Server - 1(T4) 3 CNI-4 T4, T5, T6, T7 Server, Server, Server, Error Server - 3(T4, T5, T6), Error - 1(T7) 4 CNI-5 T1, T8, T9, T10 Reset, Reset, Error, Server Reset - 2(T1, T8), Error - 1(T9), Server - 1(T10)
逻辑说明
- 先拆分每行的工单ID和分类字符串,去除多余空格后转为列表
- 用字典按分类分组,将同分类的工单ID归集到对应列表中
- 遍历分组结果,生成
分类 - 次数(工单ID列表)格式的字符串片段 - 最后将所有片段用逗号拼接,得到目标列的内容
内容的提问来源于stack exchange,提问作者rzss275
相关产品推荐
相关产品推荐

