2016-05-13 31 views
12

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.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?

Trả lời

17

Cập nhật: df.get_value không được chấp nhận kể từ phiên bản 0.21.0. Sử dụng df.at hoặc df.iat là phương pháp được đề xuất trong tương lai.


df.at chỉ có thể truy cập một giá trị tại một thời điểm.

df.loc có thể chọn nhiều hàng và/hoặc cột.

Lưu ý rằng có cũng df.get_value là, có thể thậm chí nhanh hơn ở việc tiếp cận các giá trị duy nhất:

In [25]: %timeit df.loc[('a', 'A'), ('c', 'C')] 
10000 loops, best of 3: 187 µs per loop 

In [26]: %timeit df.at[('a', 'A'), ('c', 'C')] 
100000 loops, best of 3: 8.33 µs per loop 

In [35]: %timeit df.get_value(('a', 'A'), ('c', 'C')) 
100000 loops, best of 3: 3.62 µs per loop 

Dưới mui xe, df.at[...]calls df.get_value, nhưng nó cũng làm some type checking trên các phím.

+2

Xin lưu ý rằng 'get_value' không còn được dùng kể từ phiên bản 0.21.0. – Cleb

Các vấn đề liên quan