diff --git a/dask/dataframe/core.py b/dask/dataframe/core.py
index 5c55ab9b4..54f256c24 100644
--- a/dask/dataframe/core.py
+++ b/dask/dataframe/core.py
@@ -2565,7 +2565,7 @@ class DataFrame(_Frame):
         df2 = self._meta.assign(**_extract_meta(kwargs))
         return elemwise(methods.assign, self, *pairs, meta=df2)
 
-    @derived_from(pd.DataFrame)
+    @derived_from(pd.DataFrame, ua_args=['index'])
     def rename(self, index=None, columns=None):
         if index is not None:
             raise ValueError("Cannot rename index.")
@@ -3536,7 +3536,17 @@ def apply_and_enforce(func, args, kwargs, meta):
     if isinstance(df, (pd.DataFrame, pd.Series, pd.Index)):
         if len(df) == 0:
             return meta
-        c = meta.columns if isinstance(df, pd.DataFrame) else meta.name
+
+        if isinstance(df, pd.DataFrame):
+            # Need nan_to_num otherwise nan comparison gives False
+            if not np.array_equal(np.nan_to_num(meta.columns),
+                                  np.nan_to_num(df.columns)):
+                raise ValueError("The columns in the computed data do not match"
+                                 " the columns in the provided metadata")
+            else:
+                c = meta.columns
+        else:
+            c = meta.name
         return _rename(c, df)
     return df
 
diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst
index df2d77421..6bc853540 100644
--- a/docs/source/changelog.rst
+++ b/docs/source/changelog.rst
@@ -14,6 +14,7 @@ Dataframe
 +++++++++
 
 - Add to/read_json (:pr:`3494`) `Martin Durant`_
+- Adds ``index`` to unsupported arguments for ``DataFrame.rename`` method (:pr:`3522`) `James Bourbeau`_
 
 Bag
 +++

dask.dataframe.DataFrame.rename not allowed
Is it really not allowed to rename columns of Dask DataFrame's?

The code to reproduce it:

```python
import pandas as pd
import dask.dataframe as dd
df1 = pd.DataFrame(data={'a':[1,2,3],'b':[10,20,30]})
dd1 = dd.from_pandas(df1, npartitions=3)
dd1.rename(index=str, columns={'a':'A'})
```
gives
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "/path/to/Python-3.6.3/lib/python3.6/site-packages/dask/dataframe/core.py", line 2565, in rename
>     raise ValueError("Cannot rename index.")
> ValueError: Cannot rename index.

The corresponding line in the core.py says:
```python
        if index is not None:
            raise ValueError("Cannot rename index.")
```
However, even Dask's own documentation examples allow `index=str`:
http://dask.pydata.org/en/latest/dataframe-api.html#dask.dataframe.DataFrame.rename
diff --git a/dask/dataframe/io/tests/test_io.py b/dask/dataframe/io/tests/test_io.py
index adee19cb3..0c8e582ee 100644
--- a/dask/dataframe/io/tests/test_io.py
+++ b/dask/dataframe/io/tests/test_io.py
@@ -514,6 +514,29 @@ def test_from_delayed():
     assert str(e.value).startswith('Metadata mismatch found in `from_delayed`')
 
 
+def test_from_delayed_misordered_meta():
+    df = pd.DataFrame(
+        columns=['(1)', '(2)', 'date', 'ent', 'val'],
+        data=[range(i * 5, i * 5 + 5) for i in range(3)],
+        index=range(3)
+    )
+
+    # meta with different order for columns
+    misordered_meta = pd.DataFrame(
+        columns=['date', 'ent', 'val', '(1)', '(2)'],
+        data=[range(5)]
+    )
+
+    ddf = dd.from_delayed([delayed(lambda: df)()], meta=misordered_meta)
+
+    with pytest.raises(ValueError) as info:
+        #produces dataframe which does not match meta
+        ddf.reset_index().compute()
+    msg = "The columns in the computed data do not match the columns in the" \
+          " provided metadata"
+    assert msg in str(info.value)
+
+
 def test_from_delayed_sorted():
     a = pd.DataFrame({'x': [1, 2]}, index=[1, 10])
     b = pd.DataFrame({'x': [4, 1]}, index=[100, 200])

pip install -e .[complete]
parse_log_pytest
pytest
pytest flake8 pytest-xdist moto
apt-get update apt-get install -y gcc
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
boto3==1.23.10
botocore==1.26.10
certifi==2021.5.30
cffi==1.15.1
charset-normalizer==2.0.12
click==8.0.4
cloudpickle==2.2.1
cryptography==40.0.2
-e git+https://github.com/dask/dask.git@771a045cd9196b37af54bee16761da7330c943a6#egg=dask
dataclasses==0.8
distributed==1.21.8
execnet==1.9.0
flake8==5.0.4
HeapDict==1.0.1
idna==3.10
importlib-metadata==4.2.0
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
Jinja2==3.0.3
jmespath==0.10.0
locket==1.0.0
MarkupSafe==2.0.1
mccabe==0.7.0
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
moto==4.0.13
msgpack==1.0.5
numpy==1.19.5
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pandas==1.1.5
partd==1.2.0
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
psutil==7.0.0
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pycodestyle==2.9.1
pycparser==2.21
pyflakes==2.5.0
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
pytest-xdist==3.0.2
python-dateutil==2.9.0.post0
pytz==2025.2
requests==2.27.1
responses==0.17.0
s3transfer==0.5.2
six==1.17.0
sortedcontainers==2.4.0
tblib==1.7.0
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
toolz==0.12.0
tornado==6.1
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
urllib3==1.26.20
Werkzeug==2.0.3
xmltodict==0.14.2
zict==2.1.0
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: dask
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - boto3==1.23.10
      - botocore==1.26.10
      - cffi==1.15.1
      - charset-normalizer==2.0.12
      - click==8.0.4
      - cloudpickle==2.2.1
      - cryptography==40.0.2
      - dataclasses==0.8
      - distributed==1.21.8
      - execnet==1.9.0
      - flake8==5.0.4
      - heapdict==1.0.1
      - idna==3.10
      - importlib-metadata==4.2.0
      - jinja2==3.0.3
      - jmespath==0.10.0
      - locket==1.0.0
      - markupsafe==2.0.1
      - mccabe==0.7.0
      - moto==4.0.13
      - msgpack==1.0.5
      - numpy==1.19.5
      - pandas==1.1.5
      - partd==1.2.0
      - psutil==7.0.0
      - pycodestyle==2.9.1
      - pycparser==2.21
      - pyflakes==2.5.0
      - pytest-xdist==3.0.2
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - requests==2.27.1
      - responses==0.17.0
      - s3transfer==0.5.2
      - six==1.17.0
      - sortedcontainers==2.4.0
      - tblib==1.7.0
      - toolz==0.12.0
      - tornado==6.1
      - urllib3==1.26.20
      - werkzeug==2.0.3
      - xmltodict==0.14.2
      - zict==2.1.0
prefix: /opt/conda/envs/dask

dask/dataframe/io/tests/test_io.py::test_from_delayed_misordered_meta
dask/dataframe/io/tests/test_io.py::test_meta_from_array dask/dataframe/io/tests/test_io.py::test_meta_from_1darray dask/dataframe/io/tests/test_io.py::test_meta_from_recarray dask/dataframe/io/tests/test_io.py::test_from_array dask/dataframe/io/tests/test_io.py::test_from_array_with_record_dtype dask/dataframe/io/tests/test_io.py::test_from_pandas_dataframe dask/dataframe/io/tests/test_io.py::test_from_pandas_small dask/dataframe/io/tests/test_io.py::test_from_pandas_series dask/dataframe/io/tests/test_io.py::test_from_pandas_non_sorted dask/dataframe/io/tests/test_io.py::test_from_pandas_single_row dask/dataframe/io/tests/test_io.py::test_from_pandas_with_datetime_index dask/dataframe/io/tests/test_io.py::test_DataFrame_from_dask_array dask/dataframe/io/tests/test_io.py::test_Series_from_dask_array dask/dataframe/io/tests/test_io.py::test_from_dask_array_compat_numpy_array dask/dataframe/io/tests/test_io.py::test_from_dask_array_compat_numpy_array_1d dask/dataframe/io/tests/test_io.py::test_from_dask_array_struct_dtype dask/dataframe/io/tests/test_io.py::test_from_dask_array_unknown_chunks dask/dataframe/io/tests/test_io.py::test_to_bag dask/dataframe/io/tests/test_io.py::test_to_records dask/dataframe/io/tests/test_io.py::test_from_delayed dask/dataframe/io/tests/test_io.py::test_from_delayed_sorted dask/dataframe/io/tests/test_io.py::test_to_delayed dask/dataframe/io/tests/test_io.py::test_to_delayed_optimize_graph
dask/dataframe/core.py docs/source/changelog.rst
dask/dataframe/core.py docs/source/changelog.rst