如何创建一个部分列共享底层数据、部分列独立存储的 DataFrame

夏婷酱_2476

夏婷酱_2476

2026-06-02

926人浏览

原创

如何创建一个部分列共享底层数据、部分列独立存储的 DataFrame

Pandas 中可通过 copy=False 构造多个 DataFrame 共享同一 NumPy 数组的内存,再对其中某个 DataFrame 添加新列(自动拷贝),从而实现“部分视图、部分独立”的混合结构。

在 pandas 中,可以通过合理利用底层 numpy 数组的内存共享机制与列添加行为,构造出一种特殊的 dataframe:其部分列(如原始构造列)是原始数组的视图(view),而新增列则独立分配内存、不参与共享——即实现“部分视图、部分非视图”的混合状态。

这种结构并非 Pandas 显式支持的“半视图 DataFrame”类型,而是通过构造策略和操作时序自然形成的内存布局。核心原理在于:

  • 使用 pd.DataFrame(arr, copy=False) 时,若 arr 是可写、C-contiguous 的 NumPy 数组,DataFrame 的列将直接引用该数组的内存块(即共享底层数据);
  • 后续对某 DataFrame 执行 df["new_col"] = value 操作时,Pandas 会为该列分配全新内存(即使值是标量或广播数组),因此该列不与其他 DataFrame 共享数据;
  • 而原始列(由 arr 初始化所得)仍保持与 arr 及其他同源 DataFrame 的内存关联。

以下是一个完整示例:

import pandas as pd
import numpy as np

# 创建共享底层数组
arr = np.array([[1, 2, 3],
                [4, 5, 6]], dtype=float)

# 构造两个共享 arr 的 DataFrame(copy=False)
df1 = pd.DataFrame(arr, columns=["a1", "b1", "c1"], copy=False)
df2 = pd.DataFrame(arr, columns=["a2", "b2", "c2"], copy=False)

# 向 df2 添加新列 —— 此列独立分配内存,不共享 arr
df2["d"] = 999

print("初始 df1:")
print(df1)
print("\n初始 df2:")
print(df2)

输出:

初始 df1:
   a1  b1  c1
0   1   2   3
1   4   5   6

初始 df2:
   a2  b2  c2    d
0   1   2   3  999
1   4   5   6  999

此时,df1[["a1","b1","c1"]] 与 df2[["a2","b2","c2"]] 共享 arr 内存;而 df2["d"] 是独立列,修改它不会影响 df1 或 arr。

验证共享行为:

魔乐社区
魔乐社区

魔乐社区是一款面向人工智能开发者的模型、数据、工具和应用协同社区。

下载
# 修改 df1 的整行 → 同时影响 df2 的原始列
df1.loc[0, :] = -1

print("\n修改 df1 第 0 行后:")
print("df1:")
print(df1)
print("\ndf2:")
print(df2)

输出:

修改 df1 第 0 行后:
df1:
   a1  b1  c1
0  -1  -1  -1
1   4   5   6

df2:
   a2  b2  c2    d
0  -1  -1  -1  999
1   4   5   6  999

可见 df2 的 a2/b2/c2 列同步更新,但 d 列保持不变,证实了“部分视图、部分独立”的结构已达成。

⚠️ 注意事项:

  • copy=False 并非总能生效:若输入数组不可写(arr.flags.writeable = False)、非连续(not arr.flags.c_contiguous)或 dtype 不兼容,Pandas 会静默回退为 copy=True;
  • 此行为属于底层实现细节,不推荐用于生产环境的关键逻辑——因易受 Pandas 版本更新、数组状态变化影响,且违背“显式优于隐式”的设计原则;
  • 若需安全的数据共享,建议显式使用 .values 或 .to_numpy() 获取视图,并用 pd.DataFrame(view, copy=False) 构造;新增列应明确理解其内存独立性。

总结:虽然 Pandas 没有提供“部分视图 DataFrame”的 API,但借助 copy=False 构造 + 增量列赋值的组合,确实可实现所需效果。理解其内存机制有助于深入掌握 DataFrame 的底层行为,但在工程实践中,更推荐通过清晰的数据流设计(如统一源头 + 显式复制/视图)来保障可维护性与可预测性。

相关专题

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

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

2025.12.04

340

15

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

2026.01.31

272

21

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

2026.04.13

751

25

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

2026.11.02

0

14

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

2026.11.02

0

17

Uvicorn安装配置教程
Uvicorn安装配置教程

本专题汇总了Uvicorn的安装配置教程与部署指南,涵盖通过pip安装Uvicorn、启动FastAPI/Starlette应用、开发模式热重载(--reload)及多进程工作模式配置等核心操作。同时整理了结合Gunicorn的生产部署方案、HTTPS与反向代理配置及性能调优技巧,助你快速完成Uvicorn服务的安装与上线部署。

2026.11.02

0

17

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

120

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

80

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

280

10

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习