使用 df.at 更新 DataFrame 多行时避免列表引用共享问题

发布时间 - 2025-12-29 00:00:00    点击率:

在 pandas 中用 `df.at[index, col]` 循环赋值列表时,若直接赋值同一可变对象(如列表),所有行将指向内存中同一个列表实例,导致最终全部显示最后一次修改的结果;正确做法是每次赋值时传入 `.copy()` 或新建副本。

当你在循环中反复对 df.at[index, 'test'] 赋值同一个列表对象(如 lista)时,Pandas 并不会自动深拷贝该对象——它只是将该列表的引用存入每一行。由于 lista 是一个可变对象,后续 lista.append(...) 会持续修改其内容,所有已赋值的单元格都指向这个动态变化的同一内存地址,因此最终每行显示的都是循环结束时 lista 的最终状态。

✅ 正确解法:每次赋值前创建独立副本
使用 .copy()(浅拷贝)即可满足本例需求(因内层子列表本身是新生成的,无需深拷贝):

import pandas as pd
import random

# 构造初始 DataFrame
data = {
    'col1': [random.randint(0, 100) for _ in range(5)],
    'col2': [random.randint(0, 100) for _ in range(5)]
}
df = pd.DataFrame(data)
df['test'] = None

lista = []
for index, row in df.iterrows():
    # 生成新的随机子列表
    sublist = [random.randint(0, 100) for _ in range(5)]
    lista.append(sublist)
    # 关键:赋值时使用 lista.copy(),确保每行保存当前状态的独立快照
    df.at[index, 'test'] = lista.copy()
    print(f"Index {index}: {lista}")

print("\n最终 DataFrame:")
print(df[['test']])

? 输出效果(示意):

Index 0: [[82, 14, 67, 33, 91]]
Index 1: [[82, 14, 67, 33, 91], [5, 77, 22, 48, 96]]
Index 2: [[82, 14, 67, 33, 91], [5, 77, 22, 48, 96], [31, 88, 12, 64, 50]]
...

⚠️ 注意事项:

  • ❌ 避免 df.at[index, 'test'] = lista(无 .copy());
  • ✅ 若子列表中还嵌套可变对象(如字典、其他列表),且需完全隔离,请改用 copy.deepcopy(lista);
  • ⚡ 性能提示:频繁使用 iterrows() + df.at 属于显式循环,在大数据量下较慢;如逻辑允许,优先考虑向量化操作或 cumsum()/expanding() 等内置累积方法;
  • ? 替代思路(更 Pythonic):可用列表推导式预生成所有中间状态,再一次性赋值,避免循环中重复引用问题。

总结:Pandas 的标量赋值不自动克隆可变对象。理解「引用 vs 副本」是安全操作嵌套数据结构的关键——尤其在 df.at、df.loc 或 Series 赋值场景中,务必主动管理对象生命周期。


# python  # 大数据  # app  # pandas  # 循环  # 数据结构  # append  # copy  # 对象  # 都是  # 是一个  # 你在  # 将该  # 结束时  # 较慢  # 单元格  # 本例  # 景中 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JavaScript中如何操作剪贴板_ClipboardAPI怎么用  如何在局域网内绑定自建网站域名?  如何在宝塔面板创建新站点?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  如何用AI帮你把自己的生活经历写成一个有趣的故事?  Laravel如何升级到最新版本?(升级指南和步骤)  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  制作旅游网站html,怎样注册旅游网站?  Laravel怎么清理缓存_Laravel optimize clear命令详解  开心动漫网站制作软件下载,十分开心动画为何停播?  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  如何快速搭建高效简练网站?  JS去除重复并统计数量的实现方法  微信小程序 配置文件详细介绍  如何制作一个表白网站视频,关于勇敢表白的小标题?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  如何在自有机房高效搭建专业网站?  IOS倒计时设置UIButton标题title的抖动问题  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Python文件流缓冲机制_IO性能解析【教程】  b2c电商网站制作流程,b2c水平综合的电商平台?  用v-html解决Vue.js渲染中html标签不被解析的问题  C++用Dijkstra(迪杰斯特拉)算法求最短路径  如何实现javascript表单验证_正则表达式有哪些实用技巧  教你用AI润色文章,让你的文字表达更专业  如何在Windows虚拟主机上快速搭建网站?  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Laravel Fortify是什么,和Jetstream有什么关系  HTML 中动态设置元素 name 属性的正确语法详解  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  如何用y主机助手快速搭建网站?  高防服务器租用如何选择配置与防御等级?  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  如何快速搭建高效WAP手机网站吸引移动用户?  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  Laravel如何实现文件上传和存储?(本地与S3配置)  在线教育网站制作平台,山西立德教育官网?  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  如何在云主机上快速搭建多站点网站?  佛山企业网站制作公司有哪些,沟通100网上服务官网?