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

Pandas DataFrame中table['bar':'foo']切片返回异常结果的规则解析

解释Pandas中table['bar':'foo']的切片行为

我来帮你拆解这个看起来有点反直觉的行为,核心得搞明白Pandas对[]切片的规则:

你的操作与结果

  1. 初始化代码:
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
  1. 执行切片代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 10:52:28