为何使用.loc选取DataFrame多行时需用双括号?
关于.loc使用双括号选取多行的原因
核心要先搞懂.loc和.iloc的索引逻辑差异:
.iloc是位置索引,遵循Python原生的左闭右开切片规则,df.iloc[1:8]会选取第1到第7位(共7行)的内容,结束位置8不会被包含。.loc是标签索引,它的单括号切片是左闭右闭的,df.loc[1:8]会把标签为1到8的所有行(共8行)都选出来——这和.iloc的切片行为完全不同。
那为什么.loc能用[[1,2,3,4,5,6,7]]这种双括号写法?
- 单括号
[]在.loc里有两种作用:如果传的是切片(比如1:8),就按标签范围匹配;如果传单个标签(比如1),返回的是单行的Series。 - 双括号
[[]]里的内容是一个标签列表,pandas会把它识别成“我要选这些独立的标签”,不管标签是否连续,返回的都是DataFrame(哪怕只选一行也是DataFrame格式)。
举个实际场景的例子:
如果你的DataFrame行标签是默认的0、1、2……这种连续整数(和位置索引重合):
df.iloc[1:8]拿的是位置1到7的7行;df.loc[1:8]拿的是标签1到8的8行;df.loc[[1,2,3,4,5,6,7]]则精准选取标签1到7的7行,结果和.iloc[1:8]完全一致——这时候用列表就是为了明确指定要选的标签,避免.loc切片多包含一个标签8的行。
如果行标签不是连续整数(比如是字符串、不规则数字),这种差异会更显著:比如行标签是['x','y','z','a','b'],df.loc['y':'b']会把y、z、a、b全选,而df.loc[['y','z','a']]只选这三个指定标签的行。
简单说,双括号的本质是传入一个标签集合,告诉pandas“就选这几个具体的标签”,而不是选一个连续的标签范围。
内容的提问来源于stack exchange,提问作者help_180399
相关产品推荐
相关产品推荐

