Pandas中where()方法结合另一个Series的使用疑问求解
关于Pandas where()方法中短布尔Series的匹配逻辑
首先明确两个核心规则:
where()的基础逻辑:当条件序列cond对应位置为True时,保留原序列s的值;为False或**缺失值(NaN)**时,替换为指定的other值(此处为99)。- Pandas的索引对齐机制:当两个Series进行操作时,会优先按索引值匹配,而非按位置顺序循环填充。
拆解你的示例代码
原序列
s的结构:s = pd.Series(range(5)) # 输出: # 0 0 # 1 1 # 2 2 # 3 3 # 4 4它的索引为
[0,1,2,3,4],每个索引对应一个数值。条件序列
t的结构:t = pd.Series([True, False]) # 输出: # 0 True # 1 False它的索引仅为
[0,1],仅这两个索引有布尔值,其余索引(2、3、4)在t中不存在,对应的值为NaN。s.where(t, 99)的匹配过程:- 索引0:
t[0] = True→ 保留s[0] = 0 - 索引1:
t[1] = False→ 替换为99 - 索引2:
t中无此索引 → 视为NaN(等价于False)→ 替换为99 - 索引3:同上 → 替换为99
- 索引4:同上 → 替换为99
- 索引0:
这就是你得到对应输出的原因:Pandas并非将短序列t循环拉长,而是按索引对齐,不存在的索引位置会被判定为条件不成立,因此被替换为指定值。
补充:按位置循环匹配的实现方式
如果想要让短布尔序列按位置循环覆盖长序列,需忽略索引,直接使用布尔数组(而非Series)作为条件:
s.where([True, False], 99) # 输出: # 0 0 # 1 99 # 2 2 # 3 99 # 4 4
此处使用普通列表(会被转为numpy布尔数组),Pandas会按位置循环匹配,而非按索引对齐。
内容的提问来源于stack exchange,提问作者ddd
相关产品推荐
相关产品推荐

