大熊猫的速度df.loc [x,'column']

时间:2017-07-19 16:28:48

标签: python pandas

我有一个大约100行的pandas DataFrame,我需要以有效的方式从列中为给定索引选择值。目前我正在使用df.loc[index, 'col'],但这似乎相对较慢:

df = pd.DataFrame({'col': range(100)}, index=range(100))    
%timeit df.loc[random.randint(0, 99), 'col']
#100000 loops, best of 3: 19.3 µs per loop

似乎更快(大约10倍)是将数据框转换为字典,然后查询:

d = df.to_dict()    
%timeit d['col'][random.randint(0, 99)]
#100000 loops, best of 3: 2.5 µs per loop

有没有办法在没有明确创建dict的情况下使用普通数据框架方法获得类似的性能?我应该使用.loc以外的其他内容吗?

或者这只是我最好使用这种解决方法?

2 个答案:

答案 0 :(得分:0)

如果要考虑有效率,Numpy阵列可能是比熊猫数据帧更好的选择。我尝试重现您的示例以衡量效率比较:

import numpy as np
import pandas as pd
import timeit, random

df = pd.DataFrame({'col': range(100)}, index=range(100)) 
print(timeit.timeit('df.loc[random.randint(0, 99), "col"]', number=10000, globals=globals()))

ds_numpy = np.array(df)
print(timeit.timeit('ds_numpy[ds_numpy[random.randint(0, 99)]]', number=10000, globals=globals()))

结果:

$ python test_pandas_vs_numpy.py 
0.1583892970229499
0.05918855100753717

在这种情况下,看起来比使用Numpy数组而不是pandas数据帧在性能方面是优势。

参考:1

答案 1 :(得分:0)

dict确实似乎是最快的选择:

df_dict = df.to_dict()
df_numpy = np.array(df)
print(timeit.timeit("df.loc[random.randint(0, 99), 'col']", number = 100000, globals=globals()))
print(timeit.timeit("df.get_value(random.randint(0, 99), 'col')", number = 100000, globals=globals()))
print(timeit.timeit('df_numpy[df_numpy[random.randint(0, 99)]]', number=100000, globals=globals()))
print(timeit.timeit("df_dict['col'][random.randint(0, 99)]", number = 100000, globals=globals()))

结果:

4.859706375747919
1.8850274719297886
1.4855970665812492
0.6550335008651018
相关问题