(df==0) vs. (df.values==0) performance penalty
#### Code Sample, a copy-pastable example if possible

```python
import numpy as np
import pandas as pd
T = 5000
S = 1000
X = np.random.randint(0, 10, size=(T, S))
df = pd.DataFrame(X, index=pd.date_range("2001-01-01", periods=T, freq="D"))
%timeit (df == 0)
>>> 327 ms ± 4.99 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit (df.values == 0)
2.85 ms ± 36.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

```
#### Problem description

I am using the boolean frame `df == 0` to find and set zeros in a given DataFrame `df`, i.e.
df[df == 0] = FOO, where FOO is some nonzero integer.

I found that using the expression df[df.values == 0] = FOO gives a significant speed-up. 

I am wondering if the large overhead of (df == 0) compared to (df.values == 0) is to be expected. If so, then in which situation should I prefer the expression `df[df == 0]` over the much faster `df[df.values == 0]`?


#### Expected Output

#### Output of ``pd.show_versions()``

<details>

INSTALLED VERSIONS
------------------
commit: None

pandas: 0.24.2
pytest: None
pip: 19.1.1
setuptools: 41.0.1
Cython: 0.29.6
numpy: 1.15.4
scipy: 1.1.0
pyarrow: None
xarray: None
IPython: 7.6.0
sphinx: None
patsy: 0.5.1
dateutil: 2.8.0
pytz: 2019.1
blosc: None
bottleneck: None
tables: None
numexpr: None
feather: None
matplotlib: 2.2.3
openpyxl: None
xlrd: 1.2.0
xlwt: None
xlsxwriter: None
lxml.etree: None
bs4: None
html5lib: None
sqlalchemy: None
pymysql: None
psycopg2: None
jinja2: 2.10.1
s3fs: None
fastparquet: None
pandas_gbq: None
pandas_datareader: None
gcsfs: None

</details>
