Я пытался найти наиболее эффективный способ выбора диапазона в pandas кадре данных для индекса строки (в моем случае использования в реальном мире это даты, которые я преобразовал в строку: было бы быстрее с pandas Дата-время?)
Настройка
import pandas as pd
import io
import time as t
df = pd.read_csv(io.StringIO(
"col,value\n\
a,1\n\
b,2\n\
c,3\n\
d,1\n\
e,2\n\
f,3\n\
g,1\n\
h,2\n\
i,3\n\
j,1\n\
k,2\n\
l,3\n\
m,1\n\
n,2\n\
p,3"
))
df.index = df['col']
num_runs=1000
И 3 теста:
# solution 1
start = t.process_time()
for i in range(0,num_runs):
df.loc["a":"j"]
end = t.process_time()
print(f"1: {1e4*(end-start)/num_runs:.2f}m")
#solution 2
start = t.process_time()
for i in range(0,num_runs):
df[(df.index >= "a")& (df.index <= "j" )]
end = t.process_time()
print(f"2: {1e4*(end-start)/num_runs:.2f}m")
#solution 3
start = t.process_time()
for i in range(0,num_runs):
df[(df["col"] >= "a") & (df["col"] <= "j")]
end = t.process_time()
print(f"3: {1e4*(end-start)/num_runs:.2f}m")
Вывод:
1: 1.56m
2: 5.00m
3: 8.75m
Я так понимаю почему 3 намного медленнее, чем другие 2, но я не уверен, что понимаю, почему 1 и 2 так сильно отличаются.
Любой гуру питона / pandas, чтобы пролить свет? Кроме того, если есть еще более эффективный способ, я, конечно, все уши.