Tôi đã khám phá cách tối ưu hóa mã của mình và chạy trên phương thức pandas
.at
. Theo documentationgấu trúc .at so với .loc
nhanh nhãn dựa trên accessor vô hướng
Tương tự như loc, tại cung cấp nhãn dựa tra cứu vô hướng. Bạn cũng có thể đặt bằng cách sử dụng các chỉ mục này.
Vì vậy, tôi chạy một số mẫu:
Cài đặt
import pandas as pd
import numpy as np
from string import letters, lowercase, uppercase
lt = list(letters)
lc = list(lowercase)
uc = list(uppercase)
def gdf(rows, cols, seed=None):
"""rows and cols are what you'd pass
to pd.MultiIndex.from_product()"""
gmi = pd.MultiIndex.from_product
df = pd.DataFrame(index=gmi(rows), columns=gmi(cols))
np.random.seed(seed)
df.iloc[:, :] = np.random.rand(*df.shape)
return df
seed = [3, 1415]
df = gdf([lc, uc], [lc, uc], seed)
print df.head().T.head().T
df
trông giống như:
a
A B C D E
a A 0.444939 0.407554 0.460148 0.465239 0.462691
B 0.032746 0.485650 0.503892 0.351520 0.061569
C 0.777350 0.047677 0.250667 0.602878 0.570528
D 0.927783 0.653868 0.381103 0.959544 0.033253
E 0.191985 0.304597 0.195106 0.370921 0.631576
Cho phép sử dụng .at
và .loc
và đảm bảo tôi có được điều tương tự
print "using .loc", df.loc[('a', 'A'), ('c', 'C')]
print "using .at ", df.at[('a', 'A'), ('c', 'C')]
using .loc 0.37374090276
using .at 0.37374090276
tốc độ thử nghiệm sử dụng .loc
%%timeit
df.loc[('a', 'A'), ('c', 'C')]
10000 loops, best of 3: 180 µs per loop
Kiểm tra tốc độ sử dụng .at
%%timeit
df.at[('a', 'A'), ('c', 'C')]
The slowest run took 6.11 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 8 µs per loop
này có vẻ là một sự gia tăng tốc độ rất lớn. Ngay cả ở giai đoạn bộ nhớ đệm 6.11 * 8
là nhanh hơn rất nhiều so với 180
Câu hỏi
những hạn chế của .at
là gì? Tôi có động lực để sử dụng nó. Tài liệu nói rằng nó tương tự như .loc
nhưng nó không hoạt động tương tự. Ví dụ:
# small df
sdf = gdf([lc[:2]], [uc[:2]], seed)
print sdf.loc[:, :]
A B
a 0.444939 0.407554
b 0.460148 0.465239
nơi như print sdf.at[:, :]
kết quả trong TypeError: unhashable type
Vì vậy, rõ ràng là không giống nhau ngay cả khi mục đích là trở thành tương tự.
Điều đó có nghĩa là ai có thể cung cấp hướng dẫn về những gì có thể và không thể thực hiện với phương pháp .at
?
Xin lưu ý rằng 'get_value' không còn được dùng kể từ phiên bản 0.21.0. – Cleb