Issue 1:
If I use MultiIndex columns and if a level happens to have empty values for all columns, the saved CSV file cannot be read. I expected to recover the dataframe from the saved CSV perfectly.

I believe #6618 might be related, because this is somehow related to how Pandas uses an empty data row to separate column names and actual data when using MultiIndex columns.

Code Sample, a copy-pastable example if possible

This works as expected:

In [1]: pd.DataFrame({('a','b'): [1, 2], ('c','d'): [3, 4]}).to_csv('temp.csv', index=False)

In [2]: pd.read_csv('temp.csv', header=[0,1])
Out[2]:
a c
b d
0 1 3
1 2 4

However, if a level is empty (i.e., all columns are '' on that level), it doesn't work:

In [3]: pd.DataFrame({('a',''): [1, 2], ('c',''): [3, 4]}).to_csv('temp.csv', index=False)

In [4]: pd.read_csv('temp.csv', header=[0,1])
---------------------------------------------------------------------------
CParserError Traceback (most recent call last)
<ipython-input-73-9f097e07e5a9> in <module>()
----> 1 pd.read_csv('temp.csv', header=[0,1])

/usr/lib/python3.5/site-packages/pandas/io/parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, escapechar, comment, encoding, dialect, tupleize_cols, error_bad_lines, warn_bad_lines, skip_footer, doublequote, delim_whitespace, as_recarray, compact_ints, use_unsigned, low_memory, buffer_lines, memory_map, float_precision)
527 skip_blank_lines=skip_blank_lines)
528
--> 529 return _read(filepath_or_buffer, kwds)
530
531 parser_f.__name__ = name

/usr/lib/python3.5/site-packages/pandas/io/parsers.py in _read(filepath_or_buffer, kwds)
293
294 # Create the parser.
--> 295 parser = TextFileReader(filepath_or_buffer, **kwds)
296
297 if (nrows is not None) and (chunksize is not None):

/usr/lib/python3.5/site-packages/pandas/io/parsers.py in __init__(self, f, engine, **kwds)
610 self.options['has_index_names'] = kwds['has_index_names']
611
--> 612 self._make_engine(self.engine)
613
614 def _get_options_with_defaults(self, engine):

/usr/lib/python3.5/site-packages/pandas/io/parsers.py in _make_engine(self, engine)
745 def _make_engine(self, engine='c'):
746 if engine == 'c':
--> 747 self._engine = CParserWrapper(self.f, **self.options)
748 else:
749 if engine == 'python':

/usr/lib/python3.5/site-packages/pandas/io/parsers.py in __init__(self, src, **kwds)
1132 self._extract_multi_indexer_columns(
1133 self._reader.header, self.index_names, self.col_names,
-> 1134 passed_names
1135 )
1136 )

/usr/lib/python3.5/site-packages/pandas/io/parsers.py in _extract_multi_indexer_columns(self, header, index_names, col_names, passed_names)
906 "Passed header=[%s] are too many rows for this "
907 "multi_index of columns"
--> 908 % ','.join([str(x) for x in self.header])
909 )
910

CParserError: Passed header=[0,1] are too many rows for this multi_index of columns

Expected Output

Expected that the empty columns are read correctly because I had explicitly specified the rows to use as column index:

a c

0 1 3
1 2 4

output of pd.show_versions()

INSTALLED VERSIONS
------------------
commit: None
python: 3.5.1.final.0
python-bits: 64
OS: Linux
OS-release: 4.5.2-gnu-1
machine: x86_64
processor:
byteorder: little
LC_ALL: None
LANG: en_DK.UTF-8

pandas: 0.18.0
nose: 1.3.7
pip: 8.1.1
setuptools: 20.10.1
Cython: 0.24
numpy: 1.11.0
scipy: 0.17.0
statsmodels: None
xarray: None
IPython: 4.2.0
sphinx: 1.4
patsy: None
dateutil: 2.5.3
pytz: 2016.4
blosc: None
bottleneck: None
tables: 3.2.2
numexpr: 2.5.2
matplotlib: 1.5.1
openpyxl: None
xlrd: 0.9.4
xlwt: None
xlsxwriter: None
lxml: 3.6.0
bs4: 4.4.1
html5lib: None
httplib2: 0.9.2
apiclient: 1.5.0
sqlalchemy: 1.0.12
pymysql: None
psycopg2: 2.6.1 (dt dec pq3 ext lo64)
jinja2: 2.8
boto: None

Issue 2:
Many timeseries-related functions have a freq argument that accepts strings representing some offset value. The specific valid options are apparently known as "offset aliases." Not exactly intuitive search terms but I did eventually find https://github.com/pydata/pandas/blob/master/doc/source/timeseries.rst which lists the valid aliases.

I can understand why it's suboptimal to list all valid aliases in the docstring of every function with a freq argument but it's also frustrating for users to be told "use one of these" without being told what "these" are. Can a balance be struck?

Perhaps the aliases are already defined in some docstring and I have not found them. In this case, adding a "see here for valid aliases" would probably be sufficient. If they are not, however, what would be the best way of incorporating them?