From 23de26784535eb988915d6a7d872e5073e279763 Mon Sep 17 00:00:00 2001 From: Arabbek <1910287.arabbek.tulanboyev@gmail.com> Date: Tue, 13 Oct 2026 15:34:59 +0500 Subject: [PATCH] fix(post-processing): flatten every index level flatten reset only the first level of a MultiIndex, so a pivot with several index columns lost the others when the result was serialized. A single-level index is reset as before. Co-Authored-By: Claude Opus 5.5 (1M context) --- superset/utils/pandas_postprocessing/flatten.py | 3 ++- .../pandas_postprocessing/test_flatten.py | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/superset/utils/pandas_postprocessing/flatten.py b/superset/utils/pandas_postprocessing/flatten.py index 40db86db0607..cbe241c940f0 100644 --- a/superset/utils/pandas_postprocessing/flatten.py +++ b/superset/utils/pandas_postprocessing/flatten.py @@ -101,5 +101,6 @@ def flatten( df.columns = _columns if reset_index and not isinstance(df.index, pd.RangeIndex): - df = df.reset_index(level=0) + # every level of a MultiIndex, e.g. a pivot with several index columns + df = df.reset_index() return df diff --git a/tests/unit_tests/pandas_postprocessing/test_flatten.py b/tests/unit_tests/pandas_postprocessing/test_flatten.py index 99dbb7da038f..ca46b53e8526 100644 --- a/tests/unit_tests/pandas_postprocessing/test_flatten.py +++ b/tests/unit_tests/pandas_postprocessing/test_flatten.py @@ -181,3 +181,19 @@ def test_escape_column_name(): "level1\\,value2" + FLAT_COLUMN_SEPARATOR + "level2\\, value2", "level1\\,value3" + FLAT_COLUMN_SEPARATOR + "level2\\, value3", ] + + +def test_flat_should_reset_every_index_level(): + index = pd.MultiIndex.from_arrays( + [["a", "a", "b"], [1, 2, 1]], names=["letter", "number"] + ) + df = pd.DataFrame(index=index, data={"metric": [1, 2, 3]}) + assert pp.flatten(df).equals( + pd.DataFrame( + { + "letter": ["a", "a", "b"], + "number": [1, 2, 1], + "metric": [1, 2, 3], + } + ) + )