Python Pandas分组生成过滤列时避免覆盖的问题求助
解决DataFrame分组过滤的循环覆盖问题
需求说明
需要完成以下数据处理操作:
- 按
Label字段分组,计算每组内各测量列的最值 - 定义有效取值区间:最大值×0.6 至 最大值
- 为每个测量列生成布尔过滤列,标记数值是否在对应分组的有效区间内
- 将区间外的数值替换为
NaN
示例数据
import pandas as pd df = pd.DataFrame({ 'Measurement_1': [1, 2, 7, 9, 34, 67, 50], 'Measurement_2': [3, 4, 30, 22, 55, 13, 45], 'Label': ['cable', 'cable', 'cable', 'wood', 'wood', 'wood', 'wood'] })
原代码的问题分析
你之前的嵌套循环会出现覆盖问题,因为每次执行df[measurement +'_filtered'] = ...时,都会用当前标签对应的布尔值(其他行是NaN)覆盖整列,最终只有最后一次循环的标签结果保留,其余行全部变为NaN。
正确实现方案
无需嵌套循环逐个标签赋值,利用groupby计算分组区间后,用map为每行匹配对应分组的上下限,一次性生成整列的过滤结果。
步骤1:计算分组的有效区间
# 提取所有测量列 measurement_cols = [col for col in df.columns if col.startswith('Measurement_')] # 按Label分组,计算各测量列的最大值,再生成区间下限(最大值×0.6) group_max = df.groupby('Label')[measurement_cols].max() group_min = group_max * 0.6
步骤2:生成过滤列并替换区间外值
for col in measurement_cols: # 为每行匹配对应分组的区间上下限 lower_bound = df['Label'].map(group_min[col]) upper_bound = df['Label'].map(group_max[col]) # 生成布尔过滤列 filter_col_name = f'{col}_filtered' df[filter_col_name] = df[col].between(lower_bound, upper_bound, inclusive='both') # 将区间外的数值替换为NaN df[col] = df[col].where(df[filter_col_name])
最终结果
运行后DataFrame内容如下:
Measurement_1 Measurement_2 Label Measurement_1_filtered Measurement_2_filtered 0 NaN NaN cable False False 1 NaN NaN cable False False 2 7.0 30.0 cable True True 3 NaN NaN wood False False 4 34.0 NaN wood True False 5 67.0 55.0 wood True True 6 50.0 45.0 wood True True
内容的提问来源于stack exchange,提问作者pascal_
相关产品推荐
相关产品推荐

