2016-05-13 4 views
12

私は自分のコードを最適化する方法を模索していて、pandas.atメソッドを実行しました。 LOCへdocumentationpandas .atと.loc

高速ラベルベースのスカラーアクセサ同様

あたり、ラベルベースのスカラー検索を提供していました。これらのインデクサを使用して設定することもできます。

だから私はいくつかのサンプルを実行しました:

  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 

.at.locを使用すると私は同じこと

を取得することを確認します:よう
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

セットアップが見えます3210
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 

試験速度これは、巨大な高速化になりそうだ.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 

を使用して.loc

%%timeit 
df.loc[('a', 'A'), ('c', 'C')] 

10000 loops, best of 3: 180 µs per loop 

試験速度を使用しました。でもキャッシング段階6.11 * 8180

質問.atの制限は何

よりもはるかに高速ですか?私はそれを使う意欲がある。ドキュメントには.locと似ていますが、同様の動作はしません。例:意図は似ているとされていても

だから、明らかに TypeError: unhashable type

print sdf.at[:, :]結果ではないと同じ

# small df 
sdf = gdf([lc[:2]], [uc[:2]], seed) 

print sdf.loc[:, :] 

      A   B 
a 0.444939 0.407554 
b 0.460148 0.465239 

つまり、誰が.atメソッドで行うことができ、できないことに関する指導を提供できますか?

答えて

17

アップデート:df.get_valueはバージョン0.21.0で廃止されました。今後は、df.atまたはdf.iatを使用することをお勧めします。


df.atは、一度に1つの値にしかアクセスできません。

df.locは、複数の行および/または列を選択できます。

でも迅速に単一の値にアクセスするにあってもよいdf.get_valueもあることに注意してください、:フードの下

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 

df.at[...]calls df.get_valueが、それはまた、キーのsome type checkingを行います。

+2

バージョン0.21.0以降、 'get_value'は非推奨です。 – Cleb