Pandas中df.loc[]与df[]布尔掩码索引的使用疑问
关于Pandas中
df[]与df.loc布尔索引的困惑解答 1. df[]的行为并非仅局限于列筛选
你之前的误解很普遍,但df[](即Pandas的__getitem__方法)的逻辑是根据传入参数类型动态调整的:
- 传入字符串/字符串列表:筛选列(比如
df['FTHG']或df[['FTHG', 'FTAG']]) - 传入长度与DataFrame行数一致的布尔数组:筛选行(就是你遇到的场景)
- 传入整数切片:同样筛选行(比如
df[2:5]取第3到第5行)
你的aw_0_4 | hw_4_0生成的是长度等于pl23行数的布尔数组,所以pl23[aw_0_4 | hw_4_0]会触发行筛选逻辑,而非列筛选,自然不会抛出IndexingError。
2. df.loc的索引逻辑
df.loc是基于标签的索引器,严格遵循loc[行索引器, 列索引器]的格式:
- 省略列索引器时,默认等价于
:(选中所有列),所以pl23.loc[aw_0_4 | hw_4_0]和pl23.loc[aw_0_4 | hw_4_0, :]完全等价,都是筛选符合条件的行+所有列。 - 而
pl23.loc[:, aw_0_4 | hw_4_0]是试图用行长度的布尔数组去筛选列,但列的数量和布尔数组长度不匹配(pl23的列数远小于行数),属于索引器维度不匹配,因此直接报错。
3. 纠正你的误解
df[布尔掩码]不是df.loc[:, 布尔掩码]的简写,当掩码是行匹配的布尔数组时,它等价于df.loc[布尔掩码, :],也就是行筛选+全列选中。
举个简单验证例子:
import pandas as pd df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]}) mask = df['a'] > 1 print(df[mask]) # 筛选行,输出第2、3行 print(df.loc[mask, :]) # 和上面结果完全一致
内容的提问来源于stack exchange,提问作者Deano
相关产品推荐
相关产品推荐

