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

Pandas如何用正则提取列字符串数值,筛选DOWNREGULATE总和大于UPREGULATE的分组

问题修复方案

原代码存在的核心问题

  • 语法错误:正则匹配行的括号未闭合,直接触发语法报错
  • 正则规则错误:额外添加了不必要的双引号匹配逻辑,且仅做匹配判断,没有提取数值的逻辑
  • 统计逻辑错误:仅取分组内第一行的结果计算,没有累加整个分组的所有行数值,也未处理单行同时包含UPREGULATE和DOWNREGULATE的情况
  • 变量未初始化:若try块执行失败,变量未定义会触发后续计算报错
  • 异常捕获逻辑不规范:裸except会吞掉所有异常,不利于问题排查

修复后实现思路

  1. 先从每行Count_Relationship字段中分别提取DOWNREGULATE和UPREGULATE的数值,生成两个独立的统计列
  2. 按name分组对两个统计列求和
  3. 筛选出DOWN总和大于UP总和的name列表
  4. 用该列表过滤原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:54:03