Python二维数组for循环语法中train[][]含义及列引用问题
问题对应示例代码
for f in train.columns: missings = train[train[f] == -1][f].count()
train[][]写法的含义 这段代码里的train不是Python原生的嵌套列表(也就是常说的原生二维数组),是pandas库的DataFrame二维表对象,连续两个方括号属于链式索引操作——本质是连续执行两次单维度索引,不是专门为二维结构设计的特殊语法。
逐段拆解这行的索引逻辑:
- 第一层索引
train[train[f] == -1]:完成行维度筛选。其中train[f]是先取出当前列名f对应的整列数据,train[f] == -1会生成一个和原表行数一致的布尔值序列,把这个序列传入方括号,就会筛出所有「f列取值为-1」的行,返回一个仅包含这些行的子DataFrame。 - 第二层索引
[f]:在刚才筛出来的行子集上,取出列名为f的整列数据,返回一个一维的Series对象。 - 末尾的
.count()是统计这个Series中非空值的总数,也就是当前遍历到的f列里,被标记为-1的缺失值数量(这类写法常见于数据分析竞赛,通常会把原始缺失值统一填充为-1做标记)。
该结构属于二维数组用法的原因
Python原生二维嵌套列表的索引写法arr[i][j],本质也是链式索引:先通过arr[i]取出第i行的子列表(一维结构),再通过[j]取出子列表里第j个位置的元素,整个过程是先操作行维度、再操作列/元素维度,最终定位二维结构里的目标位置。
这段代码里的train[][]逻辑和原生二维数组的链式索引完全对齐:
- 第一次索引针对二维表的行维度做筛选,拿到符合条件的行子集
- 第二次索引针对二维表的列维度做选择,拿到目标列
整个操作最终是从「行+列」构成的二维表中,定位到满足条件的所有行的指定列位置的元素,核心逻辑和二维数组定位元素一致,区别仅在于原生二维数组一般用数字位置做下标,而DataFrame支持用列名、布尔判断条件做更灵活的索引。
注:这种链式索引仅适合做数据读取、统计的场景,如果用来给表中元素赋值,很容易触发pandas的
SettingWithCopyWarning,导致赋值不生效,官方更推荐用.loc方法一次性完成行、列索引,写法为train.loc[train[f] == -1, f].count()。
内容的提问来源于stack exchange,提问作者MinKwon Kim
相关产品推荐
相关产品推荐

