2017-12-02 8 views
2

私はpandas DataFrameオブジェクトを操作し、列の値に基づいて行を選択しています。 最初に.valuesを使用して行を選択すると、約2倍の速さになります。どうしてこれなの? 最初の例が遅い場合は、それを使用すべき理由はありますか?ブール値のマスクに基づいて行を選択する - なぜパフォーマンスに違いがありますか?

df = pd.DataFrame(np.random.randint(0, high=10, size=(1000, 4)), columns=['A', 'B', 'C', 'D']) 

%timeit df_test = df[df['A'] == 9] 
The slowest run took 4.98 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000 loops, best of 3: 363 µs per loop 

%timeit df_test = df[df['A'].values == 9] 
1000 loops, best of 3: 181 µs per loop 

答えて

2

パンダマスクは、シリーズまたはDataFrameの形式でブールマスクを返します。ナンシーマスキングは、配列の形でブールマスクを返します。

boolean maskをシリーズまたはデータフレームにマップするには、ブール値の配列を返すよりも少し時間がかかります。

つまり、インデックスにマスクをマッピングしてシリーズを返すのは、df['A'] == 9を実行したときに追加時間がかかったときです。そうでない場合は、両方が同じになります。

df['A'] == 9 

0 False 
1 False 
2 False 
3 False 
4 False 
Name: A, dtype: bool 

type(df['A'] == 9) 
pandas.core.series.Series 

df['A'].values == 9 
array([False, False, False, False, False], dtype=bool) 

type(df['A'].values == 9) 
numpy.ndarray 

をだから、numpyのマスキングは道速い場合、一連のマスキング理由:説明するために

は、あなたが今、あなたは彼らのインデックス値

# If you do numpy masking 
df2.loc[df['A'].values==4] # First index will be selected no matter what the actual index is 
    A B C D 
4 0 4 5 8 

df2.loc[df['A']==4] # Row with that index will be selected 
    A B C D 
0 7 2 8 7 
に基づいて、列 dfA 4を有している df2内の行を選択する別の方法で

df = pd.DataFrame(np.random.randint(0, high=10, size=(5, 4)), columns=list('ABCD')) 

    A B C D 
0 4 9 1 5 
1 8 6 5 0 
2 5 5 9 5 
3 2 5 7 5 
4 1 1 7 2 

df2 = pd.DataFrame(np.random.randint(0, high=10, size=(5, 4)), columns=list('ABCD'),index=[4,3,2,1,0]) 

    A B C D 
4 0 4 5 8 
3 9 6 7 2 
2 0 9 8 6 
1 2 6 2 7 
0 7 2 8 7 

をソートインデックスを持つデータフレームを持っているとしましょう

さらに、indexcolumnのデータを使用してシリーズマスキングが必要な場合があります。ホップは物事を少し良く説明しています。

+0

わかりました。第2のシナリオが速ければ、第1のシナリオを第2のシナリオに使用したいのはなぜでしょうか?そして、彼らは私が言うことができるものとまったく同じことをしているようです。 – bgrantham

+0

はい、あなたが望むなら、2番目のアプローチを使うことができます。しかし、単純なブール値の配列を必要としない場合があります。例を追加しましょう – Dark

+0

@ user2996994更新をチェックしてください – Dark

関連する問題