You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

每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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:23:14