可变范围和共享“全局”参考数据帧

时间:2019-08-22 18:22:40

标签: python pandas

Python和pandas的全新老派程序员。可变的数据类型非常酷,但是很难理解如何设置“全局”参考数据结构。

我有一堆参考数据(当前为数十MB,但最终版本中将为数百MB)。需要引用相同数据的类和脚本有很多。这是历史参考数据。通过从.CSVs批量更新,它很少更改。

将数据多次加载到内存中会非常低效。我想在第一次使用数据时加载一次,然后在每次需要时都引用相同的副本。原谅旧式的引用(我在1970年代学习编程),但是这样做的“旧方法”是声明一个GLOBAL指针变量,该变量指向包含引用数据的几个熊猫数据框的单个副本。数据帧将在第一次被引用时从.CSV加载,然后所有不同的类和脚本都将仅使用该指针变量来查找已驻留内存的数据单个副本。

我不知道是在Python / pandas中执行此操作的最佳方法,这样所有不同的模块都可以访问一个副本(不会被不必要地复制)。

我想到了一个带有访问数据单个副本的方法的容器类。问题在于,pandas.DataFrame已经提供了如此出色的功能,我希望所有其他模块都可以访问DataFrame的所有内置方法。我看到了如何将“引用数据框”作为容器类的属性,但是我相信这将导致检索该属性的每个不同代码段都将获得DataFrame的新COPY,该COPY可能为100MB +。引用同一DataFrame的所有不同代码段都不需要“防止彼此踩踏”,因为数据是只读的。但是熊猫并不知道,我担心它将为每个独立类或脚本从容器类属性中请求数据框对象复制数据。

我觉得需要以某种方式告诉pandas:“嘿,这个巨大的数据框是静态/只读参考数据,所以不要每当不同的模块请求它自己的对象句柄时复制它,好吗?”有办法吗?

谢谢!

from MyLib.refdata import RefData

rd = RefData()   # Create instance of container class that has my reference data

df = rd.OilPrices # returns 100MB pandas DataFrame object that was loaded
                           # by my container class. My fear is that pandas will make a
                           # copy of that giant dataframe so that if my code overwrites
                           # some of the data, it won't affect other users of the class who
                           # probably got their own copies. I don't want that. I want ONE
                           # copy.

1 个答案:

答案 0 :(得分:0)

假设您有一个数据框(或其他任何类型的对象):

df = pd.DataFrame(data={'col1': [1, 2], 'col2': [3, 4]})

类似于下面的分配将使新变量引用相同的对象:

df1 = df

这在"Is Python pass-by-reference or pass-by-value?" by Robert Heaton

中有详细解释

要复制基础数据,必须进行显式调用(df.copy())。