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执行流程:
- 先提取整个数据集的
Age列,得到一个一维Series对象 - 对这个
AgeSeries应用Pclass==1的布尔掩码,筛选出头等舱乘客的年龄数据
- 先提取整个数据集的
- 写法2执行流程:
- 先用
Pclass==1的布尔掩码过滤整个DataFrame,得到仅包含头等舱乘客的子DataFrame - 从这个子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,提问作者김혜성
相关产品推荐
相关产品推荐

