Pandas如何用正则提取列字符串数值,筛选DOWNREGULATE总和大于UPREGULATE的分组
问题修复方案
原代码存在的核心问题
- 语法错误:正则匹配行的括号未闭合,直接触发语法报错
- 正则规则错误:额外添加了不必要的双引号匹配逻辑,且仅做匹配判断,没有提取数值的逻辑
- 统计逻辑错误:仅取分组内第一行的结果计算,没有累加整个分组的所有行数值,也未处理单行同时包含UPREGULATE和DOWNREGULATE的情况
- 变量未初始化:若try块执行失败,变量未定义会触发后续计算报错
- 异常捕获逻辑不规范:裸except会吞掉所有异常,不利于问题排查
修复后实现思路
- 先从每行
Count_Relationship字段中分别提取DOWNREGULATE和UPREGULATE的数值,生成两个独立的统计列 - 按
name分组对两个统计列求和 - 筛选出DOWN总和大于UP总和的
name列表 - 用该列表过滤原DataFrame得到最终结果
完整可运行代码
import pandas as pd import re data = { 'name': ['allicin', 'allicin', 'allicin', 'aspirin', 'albuterol', 'albuterol'], 'Count_Relationship': [ 'DOWNREGULATE: 1', 'DOWNREGULATE: 2', 'UPREGULATE: 1 | DOWNREGULATE: 1', 'UPREGULATE: 5 | DOWNREGULATE: 1', 'DOWNREGULATE: 1', 'UPREGULATE: 3' ] } df = pd.DataFrame(data) # 定义提取数值的辅助函数 def get_count(text, type_): match = re.search(rf'{type_}: (\d+)', text) return int(match.group(1)) if match else 0 # 生成两个统计列 df['down_count'] = df['Count_Relationship'].apply(lambda x: get_count(x, 'DOWNREGULATE')) df['up_count'] = df['Count_Relationship'].apply(lambda x: get_count(x, 'UPREGULATE')) # 分组求和筛选符合条件的name name_sum = df.groupby('name')[['down_count', 'up_count']].sum() valid_names = name_sum[name_sum['down_count'] > name_sum['up_count']].index.tolist() # 过滤原表得到结果 df_filtered = df[df['name'].isin(valid_names)][['name', 'Count_Relationship']] print(df_filtered)
运行输出结果
name Count_Relationship 0 allicin DOWNREGULATE: 1 1 allicin DOWNREGULATE: 2 2 allicin UPREGULATE: 1 | DOWNREGULATE: 1
内容的提问来源于stack exchange,提问作者Electra
相关产品推荐
相关产品推荐

