有一个pandas对象,比如“pdObj1”,有一定的结构(即列名,行索引等),我想创建一个结构相同但内容不同的“pdObj2”。
最快的(代码行或执行速度)方法是什么?目前我正在使用:
pdObj2 = pdObj1.copy()
pdObj2[:] = 0
由于我经常这样做,所以我想检查这是否是最佳的。
>>> 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
设置问题:
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)]
答案 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)
这只是复制结构(索引和列)而不复制所有值然后覆盖它们,所以它可能更快。