在熊猫系列中设置值很慢,为什么?

jko*_*ian 8 python pandas

有谁知道为什么直接在熊猫系列上设置项目是如此令人难以置信的慢?我做错了什么,或者只是它的方式?

我运行了几个测试,看看在pandas Series对象上设置值的最快方法是什么.以下是从快到慢排序的结果:

初始化数组,使用整数索引设置,创建系列

%%timeit
a = np.empty(1000, dtype='float')
for i in range(len(a)):
    a[i] = 1.0
s = pd.Series(data=a)
Run Code Online (Sandbox Code Playgroud)

1000个循环,最佳3:630μs/循环

创建空列表,使用追加添加项目,创建系列

%%timeit
l = []
for i in range(1000):
    l.append(1.0)
s = pd.Series(data=l)
Run Code Online (Sandbox Code Playgroud)

1000循环,最佳3:每循环1.05毫秒

初始化数组,创建系列,使用set_value进行设置

%%timeit
a = np.empty(1000, dtype='float')
s = pd.Series(data=a)
for i in range(len(a)):
    s.set_value(i, 1.0)
Run Code Online (Sandbox Code Playgroud)

100个循环,最佳3:每循环18.5毫秒

初始化数组,创建系列,使用整数索引进行设置

%%timeit
a = np.empty(1000, dtype='float')
s = pd.Series(data=a)
for i in range(len(a)):
    s[i] = 1.0
Run Code Online (Sandbox Code Playgroud)

10个循环,每个循环最佳3:30.2 ms

初始化数组,创建系列,使用iat设置

%%timeit
a = np.empty(1000, dtype='float')
s = pd.Series(data=a)
for i in range(len(a)):
    s.iat[i] = 1.0
Run Code Online (Sandbox Code Playgroud)

10个循环,最佳3:每循环36.2 ms

初始化数组,创建系列,使用iloc设置

%%timeit
a = np.empty(1000, dtype='float')
s = pd.Series(data=a)
for i in range(len(a)):
    s.iloc[i] = 1.0
Run Code Online (Sandbox Code Playgroud)

1个循环,每个循环最好为3:280 ms

EdC*_*ica 5

来自文档

由于使用[]进行索引必须处理很多情况(单标签访问,切片,布尔索引等),因此要弄清楚您要的内容有很多开销。

所以我得到以下内容应该可以比较:

In [13]:

%%timeit
a = np.empty(1000,dtype='float')
s = pd.Series(data=a)
for i in range(len(a)):
    s.iat[i] = 1.0
10 loops, best of 3: 23.3 ms per loop
In [14]:

%%timeit
a = np.empty(1000,dtype='float')
s = pd.Series(data=a)
for i in range(len(a)):
    s.iloc[i] = 1.0
10 loops, best of 3: 159 ms per loop
Run Code Online (Sandbox Code Playgroud)

对于其他测试:

In [15]:

%%timeit
l = []
for i in range(1000):
    l.append(1.0)
s = pd.Series(data=l)
1000 loops, best of 3: 525 µs per loop
In [16]:

%%timeit
a = np.empty(1000,dtype='float')
s = pd.Series(data=a)
for i in range(len(a)):
    s.set_value(i,1.0)
100 loops, best of 3: 10.1 ms per loop
In [17]:

%%timeit
a = np.empty(1000,dtype='float')
s = pd.Series(data=a)
for i in range(len(a)):
    s[i] = 1.0
100 loops, best of 3: 17.5 ms per loop
Run Code Online (Sandbox Code Playgroud)