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)
代码说明
- 数据对齐:将每个分组的总和值存入
total列表,确保与TAG字段内的分组顺序完全匹配; - 分组拆分:用
;分割TAG字段,过滤掉分割产生的空字符串,得到独立的分组内容; - 字段提取:
- 用正则
(\d+)\|匹配分组开头的标识,作为列a的值; - 用正则
(\d+)=(\d+)提取每个分组内的n值和对应数值,分别映射到列b和列c; - 判断当前行是否为分组的最后一行,若是则填入对应总和值到列d,否则留空;
- 用正则
- 结果生成:将所有行数据收集到列表后,转换为Pandas DataFrame,得到符合预期的输出格式。
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

