0

0

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

花韻仙語

花韻仙語

发布时间:2025-12-29 13:48:08

|

919人浏览过

|

来源于php中文网

原创

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

在 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]]
...

⚠️ 注意事项:

DubbingX智声云配
DubbingX智声云配

多情绪免费克隆AI音频工具

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

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

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

49

2025.12.04

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

529

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

4

2025.12.22

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

336

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1055

2023.11.14

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

167

2025.09.12

append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

336

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1055

2023.11.14

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

121

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.5万人学习

SciPy 教程
SciPy 教程

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号