df.loc结合between筛选字符串列结果缺失行的问题排查
字符串范围筛选未包含预期行的原因
原始DataFrame
a b c d 0 M11 18 1 1.00 1 M11 17 1 1.00 2 M12 16 2 0.90 3 M12 15 2 0.90 4 S11 15 2 0.90 5 S2 13 3 0.85 6 M21 14 3 0.80 7 S21 14 3 0.80 8 M2 13 3 0.70 9 M22 12 3 0.70 10 S22 12 3 0.70 11 M31 11 4 0.65 12 S31 11 4 0.65 13 M3 10 4 0.60 14 A31 10 4 0.60 15 M32 9 4 0.55 16 S32 9 4 0.55 17 M41 8 4 0.50 18 S41 8 4 0.50 19 M42 7 4 0.45 20 S42 7 4 0.45 21 M43 6 4 0.40 22 S43 6 4 0.40 23 A51 5 4 0.35 24 A52 5 4 0.35 25 T51 5 4 0.35 26 T52 5 4 0.35 27 A53 4 4 0.30 28 T53 4 4 0.30
需求与尝试代码
想要筛选列a中介于指定值之间的d列数据,执行代码:
df.loc[df['a'].between('T52', 'T53'), 'd']
预期结果
26 0.35 27 0.30 28 0.30
实际返回结果
26 0.35 28 0.30
原因分析
这不是索引问题,而是字符串的字典序排序规则导致的:
- Pandas的
between方法对字符串采用逐字符的字典序比较,'A53'的首字符是'A','T52'的首字符是'T',在ASCII编码中'A'的数值远小于'T',因此'A53' < 'T52',不满足'T52' <= 'A53' <= 'T53'的条件,第27行被排除。 - 你预期包含第27行,是混淆了行位置范围和字符串值范围的筛选逻辑,
between是基于列a的字符串值判断,和行的位置、索引无关。
解决办法
如果需要按行的位置范围筛选,直接对行索引使用between即可:
df.loc[df.index.between(26, 28), 'd']
内容的提问来源于stack exchange,提问作者biyazelnut
相关产品推荐
相关产品推荐

