|
5 | 5 |
|
6 | 6 | import numpy as np
|
7 | 7 |
|
8 |
| -from pandas.core.dtypes.common import is_list_like |
| 8 | +from pandas.core.dtypes.common import ( |
| 9 | + is_iterator, |
| 10 | + is_list_like, |
| 11 | +) |
9 | 12 | from pandas.core.dtypes.concat import concat_compat
|
10 | 13 | from pandas.core.dtypes.missing import notna
|
11 | 14 |
|
@@ -64,9 +67,10 @@ def melt(
|
64 | 67 | value_vars : scalar, tuple, list, or ndarray, optional
|
65 | 68 | Column(s) to unpivot. If not specified, uses all columns that
|
66 | 69 | are not set as `id_vars`.
|
67 |
| - var_name : scalar, default None |
| 70 | + var_name : scalar, tuple, list, or ndarray, optional |
68 | 71 | Name to use for the 'variable' column. If None it uses
|
69 |
| - ``frame.columns.name`` or 'variable'. |
| 72 | + ``frame.columns.name`` or 'variable'. Must be a scalar if columns are a |
| 73 | + MultiIndex. |
70 | 74 | value_name : scalar, default 'value'
|
71 | 75 | Name to use for the 'value' column, can't be an existing column label.
|
72 | 76 | col_level : scalar, optional
|
@@ -217,7 +221,16 @@ def melt(
|
217 | 221 | frame.columns.name if frame.columns.name is not None else "variable"
|
218 | 222 | ]
|
219 | 223 | elif is_list_like(var_name):
|
220 |
| - raise ValueError(f"{var_name=} must be a scalar.") |
| 224 | + if isinstance(frame.columns, MultiIndex): |
| 225 | + if is_iterator(var_name): |
| 226 | + var_name = list(var_name) |
| 227 | + if len(var_name) > len(frame.columns): |
| 228 | + raise ValueError( |
| 229 | + f"{var_name=} has {len(var_name)} items, " |
| 230 | + f"but the dataframe columns only have {len(frame.columns)} levels." |
| 231 | + ) |
| 232 | + else: |
| 233 | + raise ValueError(f"{var_name=} must be a scalar.") |
221 | 234 | else:
|
222 | 235 | var_name = [var_name]
|
223 | 236 |
|
|
0 commit comments