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

使用正则筛选DataFrame列后,groupby求和报错问题排查

Pandas正则筛选列+分组求和报错解决

问题场景

有如下DataFrame,想要按正则表达式筛选指定列,再按ID分组求和,但代码运行报错:

import pandas as pd

df = pd.DataFrame({'ID':[1,1,2,2,3,3], 
                   'Invasive' : [12,1,1,0,1,0], 
                   'invasive': [1,4,5,3,4,6],
                   'Wild':[4,7,1,0,0,0],
                   'wild':[0,0,9,8,3,2],
                   'Crop':[0,0,0,0,0,0],
                   'Crop_2':[2,3,2,2,1,2]})

# 报错代码
df.groupby(['ID']).filter(regex='(Invasive)|(invasive)|(Wild)|(wild)').sum()

报错信息:DataFrameGroupBy.filter() missing 1 required positional argument: 'func',调换groupby和filter顺序后仍报错。

期望输出:

ID  Output
0   1      29
1   2      27
2   3      16

报错原因

  1. DataFrameGroupBy.filter()方法的作用是筛选分组(比如保留符合条件的整个分组),它必须接收一个func参数(判断分组是否保留的函数),根本不支持regex参数,属于用错方法。
  2. 就算先调用df.filter(regex=...)筛选列,再调用groupby('ID').filter(),还是会触发同样错误——因为后者依然是分组筛选方法,不是用来求和的工具。

正确解决方案

步骤逻辑:先筛选需要的列 → 按ID分组求和 → 整理成期望格式

修正代码

import pandas as pd

df = pd.DataFrame({'ID':[1,1,2,2,3,3], 
                   'Invasive' : [12,1,1,0,1,0], 
                   'invasive': [1,4,5,3,4,6],
                   'Wild':[4,7,1,0,0,0],
                   'wild':[0,0,9,8,3,2],
                   'Crop':[0,0,0,0,0,0],
                   'Crop_2':[2,3,2,2,1,2]})

# 1. 筛选列:保留ID和符合正则的目标列
filtered_cols = df.filter(regex='ID|(Invasive)|(invasive)|(Wild)|(wild)')
# 2. 按ID分组求和,再合并每组的多列结果为总数值
result = filtered_cols.groupby('ID').sum().sum(axis=1).reset_index(name='Output')

print(result)

代码解释

  • df.filter(regex='ID|(Invasive)|(invasive)|(Wild)|(wild)'):先筛选出ID列和所有匹配正则的目标列,避免后续求和包含无关列。
  • groupby('ID').sum():按ID分组后对每组的数值列分别求和。
  • .sum(axis=1):把每组的多个求和结果合并成一个总数值(对应Output列)。
  • .reset_index(name='Output'):把索引转为列,并命名求和结果列为Output,和期望输出格式完全匹配。

运行结果

ID  Output
0   1      29
1   2      27
2   3      16

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:50:29