如何筛选DataFrame指定两列、过滤值、删除NaN后计算相关系数
问题根源
你的代码行数不符合预期、合并过滤条件报错,核心是三个逻辑错误:
- 过滤逻辑拆分错误:你分别生成了
had_cpox、cpox_vax两个独立的过滤后DataFrame,这两个对象不是可以用来做行筛选的布尔掩码,直接对两个DataFrame做&运算会触发索引/维度对齐错误,根本无法实现“同时满足两个列过滤规则”的效果 - 空值删除未生效:pandas的
dropna()默认返回删除空值后的新DataFrame,不会原地修改原对象,你没有接收方法返回值,后续统计行数时用的还是未删除空值的原始切片 - 相关系数计算参数无效:代码里占位的
column 1、column 2不是实际存在的列对象,无法传入计算函数。
修正后可运行代码
import pandas as pd import numpy as np from scipy import stats # 未提前导入scipy.stats时需补充该行 df = pd.read_csv("assets/NISPUF17.csv") # 提取需要的两个目标列 wantedcolumns = df[["HAD_CPOX", "P_NUMVRC"]] # 生成联合过滤掩码:同时满足两个列的取值规则 filter_mask = (wantedcolumns["HAD_CPOX"].between(1, 2)) & (wantedcolumns["P_NUMVRC"] >= 1.0) # 应用过滤规则 filtered_df = wantedcolumns[filter_mask] # 删除空值并接收处理结果 clean_df = filtered_df.dropna() # 打印有效数据行数,和你预期的行数做校验 print(f"有效数据行数:{len(clean_df)}") # 传入清洗完成的两列计算皮尔逊相关系数 corr, pval = stats.pearsonr(clean_df["HAD_CPOX"], clean_df["P_NUMVRC"])
关键说明
- 多条件联合过滤时,必须基于原始DataFrame的列生成布尔判断序列(即掩码),每个判断条件单独用括号包裹,用
&表示“同时满足”、|表示“满足任意一个”,不要用过滤后的子DataFrame做逻辑运算 - 你也可以用链式写法简化流程,效果和上面分步写完全一致:
clean_df = wantedcolumns[ (wantedcolumns["HAD_CPOX"].between(1,2)) & (wantedcolumns["P_NUMVRC"] >= 1.0) ].dropna() - 所有pandas非原地操作(过滤、删空值、类型转换等)都需要用变量接收返回值,否则处理结果不会保存。
内容的提问来源于stack exchange,提问作者Jessica Amey
相关产品推荐
相关产品推荐

