4

pandas ライブラリを多用する Python コードをいくつか書きました。コードが少し遅いように見えるので、cProfile を実行して、ボトルネックがどこにあるかを確認しました。cProfile の結果によると、ボトルネックの 1 つは pandas.lib_scalar_compare の呼び出しです。

1604  262.301    0.164  262.301    0.164 {pandas.lib.scalar_compare}

私の質問はこれです - これはどのような状況で呼び出されますか? DataFrame の一部を選択するときに想定します。私のコードは次のようになります。

if (var=='9999'):
    dataTable=resultTable.ix[(resultTable['col1'] == var1)  
                                             & (resultTable['col2']==var2)].copy() 
else:
    dataTable=resultTable.ix[(resultTable['col1'] == var1)  
                                           & (resultTable['col2']==var2)
                                           & (resultTable['col3']==int(val3))].copy() 

次の質問があります。

  1. それは、ボトルネックの原因となっているコードを最終的に呼び出すコード スニペットですか?
  2. もしそうなら、これを最適化する方法はありますか?現在使用している pandas のバージョンはpandas-0.8です。

これに関するヘルプは大歓迎です。

4

2 に答える 2

1

列 col1-col3 を使用してインデックスを設定できます。おもちゃの例を次に示します。

In [1]: df = DataFrame(np.arange(20).reshape(5,4))

In [2]: df
Out[2]:
    0   1   2   3
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15
4  16  17  18  19

In [3]: df2 = df.set_index(keys=[0,1,2])

In [4]: df2
Out[4]:
           3
0  1  2
0  1  2    3
4  5  6    7
8  9  10  11
12 13 14  15
16 17 18  19

MultiIndex タプル:

In [5]: %timeit df2.ix[(4,5,6)]
10000 loops, best of 3: 99.5 us per loop

元のデータフレーム:

In [6]: %timeit df.ix[(df[0]==4) & (df[1]==5) & (df[2]==6)][3]
1000 loops, best of 3: 515 us per loop

更新:重複インデックスへの対処

In [1]: df = DataFrame(np.arange(20).reshape(5,4))

In [2]: df = concat([df, df])

In [3]: df
Out[3]:
    0   1   2   3
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15
4  16  17  18  19
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15
4  16  17  18  19

これは失敗します:

In [4]: df2 = df.set_index(keys=[0,1,2])

In [5]: df2.ix[(0,1,2)]

KeyError: u'no item named 1'

これは機能します:

In [6]: df2 = df.set_index(keys=[0,1,2]).sort()

In [7]: df2.ix[(0,1,2)]
Out[7]:
       3
0 1 2
0 1 2  3
    2  3
于 2013-02-06T20:48:31.620 に答える