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

时间:2014-04-15 08:29:33

标签: python pandas

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

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

pdObj2 = pdObj1.copy()
pdObj2[:] = 0

由于我经常这样做,所以我想检查这是否是最佳的。


Caroline Alexiou的建议时间

>>> import timeit
>>> setup = """\
... import pandas as pd
... a = pd.Series(range(int(1e6)))
... """
... 
>>> s1 = """\
... b = a.copy()
... b[:] = 0"""
... 
>>> s2 = """b = pd.Series(index=a.index).fillna(0)"""
>>> timeit.timeit(stmt=s1, setup=setup, number=100)
3.292705357803854
>>> timeit.timeit(stmt=s2, setup=setup, number=100)
140.00138844462077

DSM建议的时间

设置问题:

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)]

2 个答案:

答案 0 :(得分:2)

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

>>> 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

答案 1 :(得分:1)

另一种方法是:

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

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