每16行归一化DataFrame的代码实现正确性咨询
你的每16行归一化实现问题:警告原因与修正方案
嘿,你的代码确实会触发警告,而且可能没有真正修改原DataFrame,我来给你捋清楚问题所在,再给你更靠谱的实现方式:
原代码的核心问题
你用了链式索引(比如data_features[16*n:16*(n+1)][:]),这种写法在Pandas里很容易踩坑:
- 第一个切片
data_features[16*n:16*(n+1)]可能返回原数据的视图,也可能返回副本,这取决于Pandas的内部机制 - 第二个
[:]又做了一次索引,形成了链式操作,Pandas无法确定你要修改的是原数据还是临时副本 - 最终的结果就是:要么触发
SettingWithCopyWarning,要么你的赋值操作完全没作用到原DataFrame上
另外,手动循环1550次的效率也远不如Pandas的向量化操作,数据量越大,差异越明显。
正确的实现方式:用groupby批量处理
我们可以给每16行标记一个分组ID,然后用groupby+transform来完成归一化,既高效又不会有警告:
# 生成分组键:每16行归为一组(索引整除16即可得到分组ID) group_ids = data_features.index // 16 # 对每组执行归一化,直接替换原数据 data_features = data_features.groupby(group_ids).transform( lambda x: (x - x.mean()) / x.std() )
如果你需要原地修改(不想重新赋值给变量),可以针对每一列单独处理:
group_ids = data_features.index // 16 for col in data_features.columns: data_features[col] = data_features.groupby(group_ids)[col].transform( lambda x: (x - x.mean()) / x.std() )
额外提示
如果你的DataFrame索引不是连续整数(比如自定义索引),可以用np.arange(len(data_features)) // 16来生成分组ID,效果是一样的。
内容的提问来源于stack exchange,提问作者Anjali Agrawal
相关产品推荐
相关产品推荐

