Pandas DataFrame中table['bar':'foo']切片返回异常结果的规则解析
解释Pandas中
table['bar':'foo']的切片行为 我来帮你拆解这个看起来有点反直觉的行为,核心得搞明白Pandas对[]切片的规则:
你的操作与结果
- 初始化代码:
import numpy as np import pandas as pd data = np.arange(1,13).reshape(4,3) table = pd.DataFrame(data, index = list('abcd'), columns =['foo','bar','baz'])
生成的DataFrame:
foo bar baz a 1 2 3 b 4 5 6 c 7 8 9 d 10 11 12
- 执行切片代码:
table['bar':'foo']
得到的输出:
foo bar baz c 7 8 9 d 10 11 12
核心规则解释
这里的关键一定要记牢:当你在Pandas DataFrame中用df[start:end]这种带冒号的切片语法时,Pandas默认是对行索引做标签切片,完全不会作用在列上——哪怕你传入的start和end是列名,它也会把这些字符串当作行索引的标签来处理。
咱们再拆解具体的匹配逻辑:
- Pandas会把你传入的
'bar'和'foo',跟行索引的标签('a'、'b'、'c'、'd')按照字符串字典序来对比。 - 字符串比较是逐字符按ASCII码值来的:
'bar'的首字符是'b'(ASCII码98),行索引里:'a'(97)比'bar'小;'b'作为单个字符串,和'bar'比的话,因为'b'是'bar'的前缀且更短,所以'b'也小于'bar';'c'(99)、'd'(100)都比'bar'大。
'foo'的首字符是'f'(ASCII码102),所有行索引标签里最大的'd'(100)都比它小。
所以table['bar':'foo']实际是在筛选行索引标签大于等于'bar'且小于等于'foo'的行,也就是'c'和'd'这两行——这就是你看到这个结果的根本原因。
一句话总结:df[X:Y]是行专属的切片语法,永远作用于行索引;如果X/Y不是行索引的标签,就按字符串字典序匹配行索引,返回符合范围的行。
内容的提问来源于stack exchange,提问作者mayankkaizen
相关产品推荐
相关产品推荐

