Python 数据帧是否有非复制构造函数

Python 数据帧是否有非复制构造函数,python,pandas,Python,Pandas,转寄自 从结构化数组创建数据帧时,数据似乎被复制了? 如果数据是numpy数组的字典,我会得到类似的结果 是否存在从结构化数组或类似数组创建数据帧而不进行任何复制或检查的方法 In [44]: sarray = randn(1e7,10).view([(name, float) for name in 'abcdefghij']).squeeze() In [45]: for N in [10,100,1000,10000,100000,1000000,10000000]: ...:

转寄自

从结构化数组创建数据帧时,数据似乎被复制了? 如果数据是numpy数组的字典,我会得到类似的结果

是否存在从结构化数组或类似数组创建数据帧而不进行任何复制或检查的方法

In [44]: sarray = randn(1e7,10).view([(name, float) for name in 'abcdefghij']).squeeze()

In [45]: for N in [10,100,1000,10000,100000,1000000,10000000]:
    ...:     s = sarray[:N]
    ...:     %timeit z = pd.DataFrame(s)
    ...: 
1000 loops, best of 3: 830 µs per loop
1000 loops, best of 3: 834 µs per loop
1000 loops, best of 3: 872 µs per loop
1000 loops, best of 3: 1.33 ms per loop
100 loops, best of 3: 15.4 ms per loop
10 loops, best of 3: 161 ms per loop
1 loops, best of 3: 1.45 s per loop 
谢谢,
Dave

根据定义,这将强制数据类型为单个数据类型(例如,在这种情况下,
float64
)。没办法。这是原始阵列上的视图。请注意,这只对构造有帮助。大多数操作都倾向于制作和返回副本

In [44]: s = sarray[:1000000]
原始方法

In [45]: %timeit DataFrame(s)
10 loops, best of 3: 107 ms per loop
逼迫。传入
copy=False
(这不影响结构化数组,只影响纯单数据类型的数据数组)

请注意,
DataFrame.from_dict
DataFrame.from_records
都将复制此内容。熊猫像一个单独的Ndaray一样保存着键入的Ndaray。做一个
np.concatenate
来聚合是非常昂贵的,这是在引擎盖下完成的。使用视图可以避免此问题


如果传递的数据类型都相同,我想这可能是structrued数组的默认值。但是,您必须首先询问为什么要使用结构化数组。(显然是为了获得名称访问权.。但这是他们的另一个原因吗?

Panda的数据帧使用BlockManager将类似类型的数据整合到单个内存块中。正是这种合并成一个块的过程导致了复制。如果按如下方式初始化:

pd.DataFrame(npmatrix, copy=False)
然后数据帧将不会复制数据,而是引用它

但是,有时您可能会使用多个阵列,BlockManager会尝试将数据整合到单个块中。在那种情况下,我认为你唯一的选择就是去


我同意@DaveHirschfeld,这可以作为
consolidate=False
参数提供给
BlockManager
。Pandas会更好。

我正在使用continuum中的IOPro进行大型数据库查询。通过直接构造一个结构化数组而无需遍历python类型,它可以极大地减少所使用的内存并加快查询速度。不幸的是,从数组创建数据帧会复制它,从而失去一些性能优势。不幸的是,查询返回的数据不是单一的同构类型,因此视图技巧无法工作。如果您传递一个异构numpy数组的列表或字典,它必须复制它们,有什么原因吗?它不能仅仅引用每个数据类型吗?正如我在上面解释的,数据类型被合并到单个数据数组中,因此它们必须被连接(这是花费所有时间的地方)。你可以简单地把它们作为一个系列的目录保存,如果你想的话就不要复制。但是,您必须手动对齐它们,操作会变得棘手。最好这样做一次,然后将它们作为HDF5文件写入;它们已经被数据类型(在读取时)阻塞了。是否可以使用
consolidate=False
来引用底层数组,而不是分配内存和复制数据?复制成本可以推迟到您需要执行需要复制的操作时再支付。试试blaze。这将是一个非常重要的变化。这是可以做到的(任何事情都可以做到)。这当然是可能的,例如,
sparse
类型是不可合并的,而
类别也是不可合并的。但这需要有人付出巨大的努力。
pd.DataFrame(npmatrix, copy=False)