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

如何筛选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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 04:48:23