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

pandas中df[col][mask]与df[mask][col]两种DataFrame过滤方式有什么区别

pandas两种DataFrame过滤语法的区别

以下示例基于泰坦尼克数据集,两种待对比的写法如下:

# 写法1
df_train['Age'][df_train['Pclass']==1]
# 写法2
df_train[df_train['Pclass']==1]['Age']

1. 执行逻辑顺序不同

  • 写法1执行流程:
    1. 先提取整个数据集的Age列,得到一个一维Series对象
    2. 对这个Age Series应用Pclass==1的布尔掩码,筛选出头等舱乘客的年龄数据
  • 写法2执行流程:
    1. 先用Pclass==1的布尔掩码过滤整个DataFrame,得到仅包含头等舱乘客的子DataFrame
    2. 从这个子DataFrame中提取Age列的Series

2. 视图与副本的差异(赋值操作时风险不同)

两者如果仅用来做数据查询、不修改返回值,最终得到的数值结果完全一致,没有使用差异。但如果要对返回结果做赋值修改,两者的行为会有区别:

pandas的链式索引(连续两次使用[]取值)属于官方不推荐的写法,返回结果可能是原数据的视图,也可能是独立副本,直接赋值会触发SettingWithCopyWarning警告

  • 写法1先取列再过滤,返回的Series大概率是原数据集Age列的视图,对其赋值会直接修改原df_train的对应值
  • 写法2先过滤得到的子DataFrame大概率是独立副本,对它的Age列赋值不会影响原df_train,同时会抛出警告

最佳实践

官方推荐统一用.loc索引器完成这类筛选需求,逻辑清晰且没有视图/副本的歧义:

df_train.loc[df_train['Pclass'] == 1, 'Age']

内容的提问来源于stack exchange,提问作者김혜성

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:36:10