如何按CostCenter键对含键值对标签列的Pandas DataFrame分组?
按Pandas DataFrame中混合键值对列的CostCenter分组实现方案
步骤说明
- 修复键值对字符串格式:当前
Tags列的内容是缺少外层大括号的JSON片段,先补全为合法JSON格式,再解析成字典。 - 提取CostCenter字段:从解析后的字典中提取
CostCenter对应的值,生成单独的列。 - 执行分组操作:基于新生成的
CostCenter列进行分组。
完整代码示例
import pandas as pd import json # 构造示例数据 data = { 'Tags': [ '"CostCenter": "Marketing", "Manager": "John Doe"', '"CostCenter": "Sales", "Manager": "Jane Smith"', '"CostCenter": "Marketing", "Manager": "Bob Brown"', '"Manager": "Alice Lee"' # 无CostCenter的情况 ] } df = pd.DataFrame(data) # 解析Tags列为字典 df['Tags_dict'] = df['Tags'].apply( lambda x: json.loads(f'{{{x}}}') if x.strip() else {} ) # 提取CostCenter,无该键时返回None df['CostCenter'] = df['Tags_dict'].apply(lambda x: x.get('CostCenter')) # 按CostCenter分组并统计每组行数 group_count = df.groupby('CostCenter').size() print("分组统计结果:") print(group_count) # 遍历分组查看详细数据 print("\n各分组详情:") for center, group in df.groupby('CostCenter'): print(f"=== {center} ===") print(group[['Tags']])
注意事项
- 如果
Tags列的字符串存在单引号、转义字符等格式问题,可以先用str.replace统一替换为双引号,确保JSON解析正常。 - 对于没有
CostCenter的行,可通过df = df.dropna(subset=['CostCenter'])过滤,或用x.get('CostCenter', 'Unknown')设置默认值。
内容的提问来源于stack exchange,提问作者Gill-Bates
相关产品推荐
相关产品推荐

