DOC: existence docs and benchmarks.

![enhancing_performance](https://cloud.githubusercontent.com/assets/1731217/3224419/636f5dfc-f034-11e3-90e8-1469a162b674.png)

I've included some documentation on existence-type associations as requested by Jeff in [this question](http://stackoverflow.com/questions/23945493/a-faster-alternative-to-pandas-isin-function/) over at Stack Overflow.

The content includes a couple of plots generated by the script bench/bench_existence.py but I was not able to find any automation that executed those bench/bench_*.py scripts, so I may be missing a hook somewhere. That script also takes a couple of minutes to run.
Is this actually the same? `df.query('index == @series')` and `df.query('index in @series')`? I don't find `in` somewhere explained in the docs of `query/eval`, but I suppose this is comparrable to the python `in`? then `index in @series` tests if the values of index appear somewhere in series, while `index == @series` tests if the values are exactly the same (which is not the same!).

You get the same because `df` and `series` are the same, but with a more realistic example:

```
In [13]: df = pd.DataFrame(range(5))

In [14]: df
Out[14]:
   0
0  0
1  1
2  2
3  3
4  4

In [15]: s = pd.Series([3,1])

In [16]: s
Out[16]:
0    3
1    1
dtype: int64

In [17]: df[df.index.isin(s)]
Out[17]:
   0
1  1
3  3

In [18]: df.query('index in @s')
Out[18]:
   0
1  1
3  3

In [19]: df.query('index == @s')
Out[19]:
   0
1  1
```
I even can't really explain that last result, as the length of both differs.