Pandas布尔切片同一指令结果不同:为何例1返回NaN例2无此情况?
问题解析:为什么两个布尔切片结果差异这么大?
这问题的核心原因完全在于两个DataFrame的索引类型不同!咱们一步步拆解来看:
1. 示例1的问题根源:不小心创建了多层索引
你在示例1里创建DataFrame时,给index参数传的是[list('abcd')]——注意这个外层的方括号!这会让Pandas生成一个只有单个层级的多层索引(MultiIndex),而不是普通的单层索引。
你可以打印data.index验证一下,输出会是:
MultiIndex([('a',), ('b',), ('c',), ('d',)], )
当你执行data[data['t'] >5]时,布尔筛选的逻辑在处理MultiIndex时会出现匹配偏差:虽然't'列能正确筛选出符合条件的行,但其他列无法和这个特殊的索引正确对齐,最终导致除了't'列之外的所有列都被填充为NaN。
2. 示例2为何正常?普通单层索引的正确匹配
示例2里的index直接传的是普通列表['Ohio', 'Colorado', 'Utah', 'New York'],生成的是标准的单层Index。这时候布尔筛选得到的布尔序列能和DataFrame的索引完美匹配,所有列都能正确保留符合条件的行,自然不会出现NaN。
3. 如何修正示例1?
只要去掉index参数的外层方括号,创建普通的单层索引就行:
import pandas as pd import numpy as np # 修正后的示例1代码 data = pd.DataFrame(np.arange(0,16).reshape(4,4), index=list('abcd'), columns=list('retz')) print(data[data['t'] >5])
执行后会得到和示例2一致的正常结果:
r e t z b 4 5 6 7 c 8 9 10 11 d 12 13 14 15
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

