slow execution with internal error visible upon interruption for indexing with dataframe: TypeError: cannot convert bool to an floatblock
This code is extremely slow (~100 rows per second):

```
%%time
df = pd.DataFrame(np.random.random((20000, 1000)), columns=['c'+str(i) for i in range(1000)])
ix = df[['c1']]>0.5
df[ix].head()
```

If I replace the last line with `df[ix.values].head()` or `df[ix.c1].head()`, then it is very fast.

I understand that the issue is using boolean dataframe, not proper boolean mask.

The interruption of execution shows this traceback:

https://github.com/pandas-dev/pandas/blob/master/pandas/core/internals.py#L733


```
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
C:\Python\Python36_64b\lib\site-packages\pandas\core\internals.py in fillna(self, value, limit, inplace, downcast, mgr)
    398         try:
--> 399             values, _, _, _ = self._try_coerce_args(self.values, value)
    400             blocks = self.putmask(mask, value, inplace=inplace)

C:\Python\Python36_64b\lib\site-packages\pandas\core\internals.py in _try_coerce_args(self, values, other)
    700                 type(other).__name__,
--> 701                 type(self).__name__.lower().replace('Block', '')))
    702 

TypeError: cannot convert bool to an floatblock

During handling of the above exception, another exception occurred:

KeyboardInterrupt                         Traceback (most recent call last)
<timed exec> in <module>()

C:\Python\Python36_64b\lib\site-packages\pandas\core\frame.py in __getitem__(self, key)
   2133             return self._getitem_array(key)
   2134         elif isinstance(key, DataFrame):
-> 2135             return self._getitem_frame(key)
   2136         elif is_mi_columns:
   2137             return self._getitem_multilevel(key)

C:\Python\Python36_64b\lib\site-packages\pandas\core\frame.py in _getitem_frame(self, key)
   2217         if key.values.size and not is_bool_dtype(key.values):
   2218             raise ValueError('Must pass DataFrame with boolean values only')
-> 2219         return self.where(key)
   2220 
   2221     def query(self, expr, inplace=False, **kwargs):

C:\Python\Python36_64b\lib\site-packages\pandas\core\generic.py in where(self, cond, other, inplace, axis, level, errors, try_cast, raise_on_error)
   6128         other = com._apply_if_callable(other, self)
   6129         return self._where(cond, other, inplace, axis, level,
-> 6130                            errors=errors, try_cast=try_cast)
   6131 
   6132     @Appender(_shared_docs['where'] % dict(_shared_doc_kwargs, cond="False",

C:\Python\Python36_64b\lib\site-packages\pandas\core\generic.py in _where(self, cond, other, inplace, axis, level, errors, try_cast)
   5878         # make sure we are boolean
   5879         fill_value = True if inplace else False
-> 5880         cond = cond.fillna(fill_value)
   5881 
   5882         msg = "Boolean array expected for the condition, not {dtype}"

C:\Python\Python36_64b\lib\site-packages\pandas\core\frame.py in fillna(self, value, method, axis, inplace, limit, downcast, **kwargs)
   3033                      self).fillna(value=value, method=method, axis=axis,
   3034                                   inplace=inplace, limit=limit,
-> 3035                                   downcast=downcast, **kwargs)
   3036 
   3037     @Appender(_shared_docs['shift'] % _shared_doc_kwargs)

C:\Python\Python36_64b\lib\site-packages\pandas\core\generic.py in fillna(self, value, method, axis, inplace, limit, downcast)
   4346                 new_data = self._data.fillna(value=value, limit=limit,
   4347                                              inplace=inplace,
-> 4348                                              downcast=downcast)
   4349             elif isinstance(value, DataFrame) and self.ndim == 2:
   4350                 new_data = self.where(self.notna(), value)

C:\Python\Python36_64b\lib\site-packages\pandas\core\internals.py in fillna(self, **kwargs)
   3454 
   3455     def fillna(self, **kwargs):
-> 3456         return self.apply('fillna', **kwargs)
   3457 
   3458     def downcast(self, **kwargs):

C:\Python\Python36_64b\lib\site-packages\pandas\core\internals.py in apply(self, f, axes, filter, do_integrity_check, consolidate, **kwargs)
   3327 
   3328             kwargs['mgr'] = self
-> 3329             applied = getattr(b, f)(**kwargs)
   3330             result_blocks = _extend_blocks(applied, result_blocks)
   3331 

C:\Python\Python36_64b\lib\site-packages\pandas\core\internals.py in fillna(self, value, limit, inplace, downcast, mgr)
    420                                     downcast=None)
    421 
--> 422             return self.split_and_operate(mask, f, inplace)
    423 
    424     def split_and_operate(self, mask, f, inplace):

C:\Python\Python36_64b\lib\site-packages\pandas\core\internals.py in split_and_operate(self, mask, f, inplace)
    476             # need a new block
    477             if m.any():
--> 478                 nv = f(m, v, i)
    479             else:
    480                 nv = v if inplace else v.copy()

C:\Python\Python36_64b\lib\site-packages\pandas\core\internals.py in f(m, v, i)
    410             # operate column-by-column
    411             def f(m, v, i):
--> 412                 block = self.coerce_to_target_dtype(value)
    413 
    414                 # slice out our block

C:\Python\Python36_64b\lib\site-packages\pandas\core\internals.py in coerce_to_target_dtype(self, other)
   1038         if self.is_bool or is_object_dtype(dtype) or is_bool_dtype(dtype):
   1039             # we don't upcast to bool
-> 1040             return self.astype(object)
   1041 
   1042         elif ((self.is_float or self.is_complex) and

C:\Python\Python36_64b\lib\site-packages\pandas\core\internals.py in astype(self, dtype, copy, errors, values, **kwargs)
    542     def astype(self, dtype, copy=False, errors='raise', values=None, **kwargs):
    543         return self._astype(dtype, copy=copy, errors=errors, values=values,
--> 544                             **kwargs)
    545 
    546     def _astype(self, dtype, copy=False, errors='raise', values=None,

C:\Python\Python36_64b\lib\site-packages\pandas\core\internals.py in _astype(self, dtype, copy, errors, values, klass, mgr, **kwargs)
    620 
    621                 else:
--> 622                     values = self.get_values(dtype=dtype)
    623 
    624                 # _astype_nansafe works fine with 1-d only

KeyboardInterrupt: 
```


Installed versions:

```
INSTALLED VERSIONS
------------------
commit: None
python: 3.6.3.final.0
python-bits: 64
OS: Windows
OS-release: 10
machine: AMD64
processor: Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
byteorder: little
LC_ALL: None
LANG: None
LOCALE: None.None

pandas: 0.22.0
pytest: None
pip: 9.0.1
setuptools: 38.5.1
Cython: 0.27.3
numpy: 1.14.0
scipy: 1.0.0
pyarrow: None
xarray: None
IPython: 6.2.1
sphinx: None
patsy: 0.4.1
dateutil: 2.6.1
pytz: 2018.3
blosc: None
bottleneck: None
tables: None
numexpr: None
feather: None
matplotlib: 2.1.2
openpyxl: 2.4.9
xlrd: None
xlwt: None
xlsxwriter: None
lxml: None
bs4: None
html5lib: 0.9999999
sqlalchemy: 1.2.0
pymysql: None
psycopg2: None
jinja2: 2.10
s3fs: None
fastparquet: None
pandas_gbq: None
pandas_datareader: None
```