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

Python数据解析优化:拆分分组标识列并添加分组求和列

问题描述

需求:

  • 从TAG字段中按;分隔的每个分组里,提取开头的标识(如1|、2|、3|中的数字)填入列a;
  • 将每个分组内形如「n=数值」的内容拆分,n值填入列b,对应数值填入列c;
  • 每个分组的总和值仅填入该组最后一行的列d。

现有数据结构:

1|1=89325|2=96682|3=81940   267947
2|1=17162|2=21282|3=23033;  61477
3|1=71761|2=73375|3=83581;  228717

注:原TAG字段为';1|1=89325|2=96682|3=81940;2|1=17162|2=21282|3=23033;3|1=71761|2=73375|3=83581',总和值需与每个分组一一对应。

现有实现代码:

import re
import pandas as pd

a = {'TAG': ';1|1=89325|2=96682|3=81940;2|1=17162|2=21282|3=23033;3|1=71761|2=73375|3=83581'}
parsed_data = re.findall(r'([\d.]+)=([\d.]+)', a['TAG'])
a = ','.join(str(dict(zip(['a', 'b', 'c'], i))) for i in parsed_data)
a = pd.DataFrame(eval(a))
print(a)

当前代码输出:

a      b
0  1  89325
1  2  96682
2  3  81940
3  1  17162
4  2  21282
5  3  23033
6  1  71761
7  2  73375
8  3  83581

预期输出:

a  b      c       d
0  1  1  89325     NaN
1  1  2  96682     NaN
2  1  3  81940  267947
3  2  1  17162     NaN
4  2  2  21282     NaN
5  2  3  23033   61477
6  3  1  71761     NaN
7  3  2  73375     NaN
8  3  3  83581  228717
优化后的代码
import re
import pandas as pd

# 原始数据:TAG字段+对应分组的总和值
data = {
    'TAG': ';1|1=89325|2=96682|3=81940;2|1=17162|2=21282|3=23033;3|1=71761|2=73375|3=83581',
    'total': [267947, 61477, 228717]
}

# 拆分TAG为独立分组,过滤空字符串
groups = [g for g in data['TAG'].split(';') if g]

result_rows = []
for group_idx, group in enumerate(groups):
    # 提取分组标识(列a的取值)
    group_id = re.match(r'(\d+)\|', group).group(1)
    # 提取分组内的n=数值对
    pairs = re.findall(r'(\d+)=(\d+)', group)
    # 生成当前分组的每一行数据
    for pair_idx, (b_val, c_val) in enumerate(pairs):
        row = {
            'a': int(group_id),
            'b': int(b_val),
            'c': int(c_val),
            'd': data['total'][group_idx] if pair_idx == len(pairs)-1 else None
        }
        result_rows.append(row)

# 转换为DataFrame并输出
df = pd.DataFrame(result_rows)
print(df)
代码说明
  1. 数据对齐:将每个分组的总和值存入total列表,确保与TAG字段内的分组顺序完全匹配;
  2. 分组拆分:用;分割TAG字段,过滤掉分割产生的空字符串,得到独立的分组内容;
  3. 字段提取:
    • 用正则(\d+)\|匹配分组开头的标识,作为列a的值;
    • 用正则(\d+)=(\d+)提取每个分组内的n值和对应数值,分别映射到列b和列c;
    • 判断当前行是否为分组的最后一行,若是则填入对应总和值到列d,否则留空;
  4. 结果生成:将所有行数据收集到列表后,转换为Pandas DataFrame,得到符合预期的输出格式。

内容的提问来源于stack exchange,提问作者Mary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:50:26