使用正则筛选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
报错原因
DataFrameGroupBy.filter()方法的作用是筛选分组(比如保留符合条件的整个分组),它必须接收一个func参数(判断分组是否保留的函数),根本不支持regex参数,属于用错方法。- 就算先调用
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
相关产品推荐
相关产品推荐

