Python 熊猫:复制结构并设置所有元素

Python 熊猫:复制结构并设置所有元素,python,pandas,Python,Pandas,有一个pandas对象,比如“pdObj1”,具有特定的结构(即列名、行索引等),我想创建一个结构相同但内容不同的“pdObj2” 最快的(代码行或执行速度)方法是什么?目前我正在使用: pdObj2 = pdObj1.copy() pdObj2[:] = 0 由于我经常这样做,我想检查这是最优的 Caroline Alexiou建议的时间安排 需求侧管理建议的时间安排 设置解决问题的方法: In [1]: import pandas as pd In [2]: a = pd.Serie

有一个pandas对象,比如“pdObj1”,具有特定的结构(即列名、行索引等),我想创建一个结构相同但内容不同的“pdObj2”

最快的(代码行或执行速度)方法是什么?目前我正在使用:

pdObj2 = pdObj1.copy()
pdObj2[:] = 0
由于我经常这样做,我想检查这是最优的


Caroline Alexiou建议的时间安排
需求侧管理建议的时间安排 设置解决问题的方法:

In [1]: import pandas as pd

In [2]: a = pd.Series(range(int(1e6)))
复制结构并将所有元素设置为新值:

In [3]: %timeit b=a.copy(); b[:]=0
10 loops, best of 3: 33.3 ms per loop

In [4]: %timeit b=pd.Series(0, index=a.index)
100 loops, best of 3: 34 ms per loop

In [5]: %timeit b=pd.Series(index=a.index).fillna(0)
1 loops, best of 3: 1.34 s per loop
复制结构并将单个元素设置为新值:

In [6]: %timeit b=a.copy(); b[:]=0; b[500000] = 1
10 loops, best of 3: 40.2 ms per loop

In [7]: %timeit b=pd.Series(0, index=a.index); b[500000]=1
100 loops, best of 3: 34.7 ms per loop
在以下时间进行的计时:

In [8]: import sys

In [9]: print (sys.version)
2.7.6 |Anaconda 1.9.1 (32-bit)| (default, Nov 11 2013, 10:50:31) [MSC v.1500 32 bit (Intel)]

另一种方法是:

 newdf = pd.DataFrame(index=prevdf.index,columns=prevdf.columns).fillna(0)

这只是复制结构(索引和列),而不复制所有值,然后覆盖它们,因此速度可能更快。

您可以将
0
作为数据参数传递,即
pd.Series(0,index=a.index)


谢谢你的推理很有说服力。我用timeit模块和pd.Series对象对它进行了一次旋转,发现您的建议明显慢了很多,这让我很惊讶。我有一种感觉,我的(天真的)方法避免了一些初始化步骤。。。有什么见解吗?嗯,看来这个菲娜不适合。。。它可能会先检查每个元素是否为null,然后再将其设置为零(这很有意义)。。。但这意味着它不是批量操作。不过,时差是巨大的——我想知道它是否已经矢量化了……谢谢。在我的机器上,两种解决方案的执行速度相同。b=A.copy(),b[:]=0有一点优势,但更令人惊讶的是,当首先将所有值设置为零,然后将单个值设置为新值时,解决方案的一个变体会快一点。(请参见我的问题中的示例。)-非常奇怪。可能还有一些版本依赖性;我用的是最前沿的熊猫,所以如果最近有什么变化的话,如果你用的是水蟒身上的任何东西,你可能都不会注意到。
 newdf = pd.DataFrame(index=prevdf.index,columns=prevdf.columns).fillna(0)
>>> a = pd.Series(range(int(1e6)))
>>> %timeit b=pd.Series(index=a.index).fillna(0)
1 loops, best of 3: 409 ms per loop
>>> %timeit b=a.copy(); b[:] = 0
100 loops, best of 3: 14.2 ms per loop
>>> %timeit b=pd.Series(0, index=a.index)
100 loops, best of 3: 8.8 ms per loop