pd.read_parquet can't handle an S3 directory
## Summary

*pyarrow* can load parquet files directly from S3. So can Dask. *pandas* seems to not be able to. This would be really cool and since you use *pyarrow* underneath it should be easy.

For example in *pyarrow*, even with push-down filters:

```python
stocks_close_ds = ParquetDataset(
    'data/v4.parquet',
    filters=[('Ticker','=',ticker)]
)
table = stocks_close_ds.read()
stocks_close_df = table.to_pandas()
```

## Code

This code loads field names from an S3 file then loads an S3 directory containing lots of parquet files. Note that I have repeatedly verified that files are there and are publicly accessible. *boto3* can directly access them individually.

```python
# Tags and their indexes were precomputed using PySpark
sorted_all_tags = json.loads(read_from_s3('sorted_all_tags.2000.json', overwrite=True))
max_index = sorted_all_tags[-1][0] + 1

# Pandas can load Parquet data using pyarrow or fastparquet
s3_path = f's3://{BUCKET}/{PATH}/Questions.Stratified.Final.2000.parquet'
posts_df = pd.read_parquet(
    s3_path,
    columns=['_Body'] + ['label_{}'.format(i) for i in range(0, max_index)],
    engine='pyarrow'
)
posts_df.head(2)
```

It throws this exception if I use `s3://bucket/path/file_dir`:

```python
ArrowIOError                              Traceback (most recent call last)
<ipython-input-6-f37a90c29660> in <module>
      5     s3_path,
      6     columns=['_Body'] + ['label_{}'.format(i) for i in range(0, max_index)],
----> 7     engine='pyarrow'
      8 )
      9 posts_df.head(2)

~/anaconda3/envs/deep/lib/python3.6/site-packages/pandas/io/parquet.py in read_parquet(path, engine, columns, **kwargs)
    294
    295     impl = get_engine(engine)
--> 296     return impl.read(path, columns=columns, **kwargs)

~/anaconda3/envs/deep/lib/python3.6/site-packages/pandas/io/parquet.py in read(self, path, columns, **kwargs)
    123         kwargs["use_pandas_metadata"] = True
    124         result = self.api.parquet.read_table(
--> 125             path, columns=columns, **kwargs
    126         ).to_pandas()
    127         if should_close:

~/anaconda3/envs/deep/lib/python3.6/site-packages/pyarrow/parquet.py in read_table(source, columns, use_threads, metadata, use_pandas_metadata, memory_map, filesystem, filters)
   1212                             filesystem=filesystem, filters=filters)
   1213     else:
-> 1214         pf = ParquetFile(source, metadata=metadata, memory_map=memory_map)
   1215     return pf.read(columns=columns, use_threads=use_threads,
   1216                    use_pandas_metadata=use_pandas_metadata)

~/anaconda3/envs/deep/lib/python3.6/site-packages/pyarrow/parquet.py in __init__(self, source, metadata, common_metadata, memory_map)
    130                  memory_map=True):
    131         self.reader = ParquetReader()
--> 132         self.reader.open(source, use_memory_map=memory_map, metadata=metadata)
    133         self.common_metadata = common_metadata
    134         self._nested_paths_by_prefix = self._build_nested_paths()

~/anaconda3/envs/deep/lib/python3.6/site-packages/pyarrow/_parquet.pyx in pyarrow._parquet.ParquetReader.open()

~/anaconda3/envs/deep/lib/python3.6/site-packages/pyarrow/error.pxi in pyarrow.lib.check_status()

ArrowIOError: Invalid Parquet file size is 0 bytes
```

It throws this exception if I use `s3://bucket/path/file_dir/* or *.parquet`:

```python
FileNotFoundError                         Traceback (most recent call last)
~/anaconda3/envs/deep/lib/python3.6/site-packages/pandas/io/s3.py in get_filepath_or_buffer(filepath_or_buffer, encoding, compression, mode)
     29     try:
---> 30         filepath_or_buffer = fs.open(_strip_schema(filepath_or_buffer), mode)
     31     except (compat.FileNotFoundError, NoCredentialsError):

~/anaconda3/envs/deep/lib/python3.6/site-packages/fsspec/spec.py in open(self, path, mode, block_size, **kwargs)
    668             f = self._open(path, mode=mode, block_size=block_size,
--> 669                            autocommit=ac, **kwargs)
    670             if not ac:

~/anaconda3/envs/deep/lib/python3.6/site-packages/s3fs/core.py in _open(self, path, mode, block_size, acl, version_id, fill_cache, cache_type, autocommit, **kwargs)
    302                       s3_additional_kwargs=kw, cache_type=cache_type,
--> 303                       autocommit=autocommit)
    304

~/anaconda3/envs/deep/lib/python3.6/site-packages/s3fs/core.py in __init__(self, s3, path, mode, block_size, acl, version_id, fill_cache, s3_additional_kwargs, autocommit, cache_type)
    919         super().__init__(s3, path, mode, block_size, autocommit=autocommit,
--> 920                          cache_type=cache_type)
    921         self.s3 = self.fs  # compatibility

~/anaconda3/envs/deep/lib/python3.6/site-packages/fsspec/spec.py in __init__(self, fs, path, mode, block_size, autocommit, cache_type, **kwargs)
    863             if not hasattr(self, 'details'):
--> 864                 self.details = fs.info(path)
    865             self.size = self.details['size']

~/anaconda3/envs/deep/lib/python3.6/site-packages/s3fs/core.py in info(self, path, version_id)
    478                 raise ValueError('Failed to head path %r: %s' % (path, e))
--> 479         return super().info(path)
    480

~/anaconda3/envs/deep/lib/python3.6/site-packages/fsspec/spec.py in info(self, path, **kwargs)
    488         else:
--> 489             raise FileNotFoundError(path)
    490

FileNotFoundError: BUCKET/PATH/Questions.Stratified.Final.2000.parquet/*

During handling of the above exception, another exception occurred:

FileNotFoundError                         Traceback (most recent call last)
<ipython-input-9-5104e6b4fbad> in <module>
      9     s3_path,
     10     columns=['_Body'] + ['label_{}'.format(i) for i in range(0, max_index)],
---> 11     engine='pyarrow'
     12 )
     13 posts_df.head(2)

~/anaconda3/envs/deep/lib/python3.6/site-packages/pandas/io/parquet.py in read_parquet(path, engine, columns, **kwargs)
    280
    281     impl = get_engine(engine)
--> 282     return impl.read(path, columns=columns, **kwargs)

~/anaconda3/envs/deep/lib/python3.6/site-packages/pandas/io/parquet.py in read(self, path, columns, **kwargs)
    123
    124     def read(self, path, columns=None, **kwargs):
--> 125         path, _, _, should_close = get_filepath_or_buffer(path)
    126
    127         kwargs['use_pandas_metadata'] = True

~/anaconda3/envs/deep/lib/python3.6/site-packages/pandas/io/common.py in get_filepath_or_buffer(filepath_or_buffer, encoding, compression, mode)
    214                                          encoding=encoding,
    215                                          compression=compression,
--> 216                                          mode=mode)
    217
    218     if is_gcs_url(filepath_or_buffer):

~/anaconda3/envs/deep/lib/python3.6/site-packages/pandas/io/s3.py in get_filepath_or_buffer(filepath_or_buffer, encoding, compression, mode)
     37         # for that bucket.
     38         fs = s3fs.S3FileSystem(anon=True)
---> 39         filepath_or_buffer = fs.open(_strip_schema(filepath_or_buffer), mode)
     40     return filepath_or_buffer, None, compression, True

~/anaconda3/envs/deep/lib/python3.6/site-packages/fsspec/spec.py in open(self, path, mode, block_size, **kwargs)
    667             ac = kwargs.pop('autocommit', not self._intrans)
    668             f = self._open(path, mode=mode, block_size=block_size,
--> 669                            autocommit=ac, **kwargs)
    670             if not ac:
    671                 self.transaction.files.append(f)

~/anaconda3/envs/deep/lib/python3.6/site-packages/s3fs/core.py in _open(self, path, mode, block_size, acl, version_id, fill_cache, cache_type, autocommit, **kwargs)
    301                       version_id=version_id, fill_cache=fill_cache,
    302                       s3_additional_kwargs=kw, cache_type=cache_type,
--> 303                       autocommit=autocommit)
    304
    305     def _lsdir(self, path, refresh=False, max_items=None):

~/anaconda3/envs/deep/lib/python3.6/site-packages/s3fs/core.py in __init__(self, s3, path, mode, block_size, acl, version_id, fill_cache, s3_additional_kwargs, autocommit, cache_type)
    918         self.s3_additional_kwargs = s3_additional_kwargs or {}
    919         super().__init__(s3, path, mode, block_size, autocommit=autocommit,
--> 920                          cache_type=cache_type)
    921         self.s3 = self.fs  # compatibility
    922         if self.writable():

~/anaconda3/envs/deep/lib/python3.6/site-packages/fsspec/spec.py in __init__(self, fs, path, mode, block_size, autocommit, cache_type, **kwargs)
    862         if mode == 'rb':
    863             if not hasattr(self, 'details'):
--> 864                 self.details = fs.info(path)
    865             self.size = self.details['size']
    866             self.cache = caches[cache_type](self.blocksize, self._fetch_range,

~/anaconda3/envs/deep/lib/python3.6/site-packages/s3fs/core.py in info(self, path, version_id)
    477             except ParamValidationError as e:
    478                 raise ValueError('Failed to head path %r: %s' % (path, e))
--> 479         return super().info(path)
    480
    481     def ls(self, path, detail=False, refresh=False, **kwargs):

~/anaconda3/envs/deep/lib/python3.6/site-packages/fsspec/spec.py in info(self, path, **kwargs)
    487             return {'name': path, 'size': 0, 'type': 'directory'}
    488         else:
--> 489             raise FileNotFoundError(path)
    490
    491     def checksum(self, path):

FileNotFoundError: BUCKET/PATH/Questions.Stratified.Final.2000.parquet/*
```

#### Problem description

It seems that `pd.read_parquet` can't read a directory structured Parquet file from Amazon S3. I've tried a wildcard and it also throws an error. This is a bummer :(

#### Expected Output

Load the data, return a DataFrame.

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

```python
INSTALLED VERSIONS
------------------
commit           : None
python           : 3.6.8.final.0
python-bits      : 64
OS               : Linux
OS-release       : 4.15.0-62-generic
machine          : x86_64
processor        : x86_64
byteorder        : little
LC_ALL           : None
LANG             : en_US.UTF-8
LOCALE           : en_US.UTF-8

pandas           : 0.25.1
numpy            : 1.17.0
pytz             : 2019.2
dateutil         : 2.8.0
pip              : 19.2.2
setuptools       : 41.0.1
Cython           : None
pytest           : None
hypothesis       : None
sphinx           : None
blosc            : None
feather          : None
xlsxwriter       : None
lxml.etree       : 4.4.1
html5lib         : None
pymysql          : None
psycopg2         : None
jinja2           : 2.10.1
IPython          : 7.7.0
pandas_datareader: None
bs4              : 4.8.0
bottleneck       : None
fastparquet      : None
gcsfs            : None
lxml.etree       : 4.4.1
matplotlib       : 3.1.1
numexpr          : None
odfpy            : None
openpyxl         : None
pandas_gbq       : None
pyarrow          : 0.14.1
pytables         : None
s3fs             : 0.3.3
scipy            : 1.3.1
sqlalchemy       : None
tables           : None
xarray           : None
xlrd             : None
xlwt             : None
xlsxwriter       : None
```
