From 45cf07ba6c88db64edeb5f501f98e56a03090b0b Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 8 Jun 2026 17:52:33 -0700 Subject: [PATCH 1/2] fix(mfdataplist): accept DataFrame with tuple cellid --- autotest/test_mf6.py | 21 +++++++++++++++++++++ flopy/mf6/data/mfdataplist.py | 16 +++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/autotest/test_mf6.py b/autotest/test_mf6.py index 3b0912b11..69fcc0f06 100644 --- a/autotest/test_mf6.py +++ b/autotest/test_mf6.py @@ -1474,6 +1474,27 @@ def test_set_data_dataframe_column_mismatch_error(function_tmpdir): spd.set_data({0: df}) +def test_set_data_dataframe_tupled_cellid(function_tmpdir): + """DataFrame with a single tupled 'cellid' column is accepted, consistent with recarrays.""" + sim = MFSimulation(sim_ws=str(function_tmpdir), exe_name="mf6") + ModflowTdis(sim, nper=1, perioddata=[(1.0, 1, 1.0)]) + ModflowIms(sim) + gwf = ModflowGwf(sim, modelname="gwf") + ModflowGwfdis(gwf, nlay=1, nrow=10, ncol=10) + ModflowGwfic(gwf, strt=0.0) + ModflowGwfnpf(gwf) + ModflowGwfwel(gwf, stress_period_data={0: [[(0, 0, 0), -1.0]]}) + spd = gwf.get_package("WEL").stress_period_data + + df = pd.DataFrame({"cellid": [(0, 3, 4)], "q": [-500.0]}) + spd.set_data({0: df}) + result = spd.get_data(key=0) + assert result is not None + assert len(result) == 1 + assert result[0]["cellid"] == (0, 3, 4) + assert result[0]["q"] == pytest.approx(-500.0) + + @requires_exe("mf6") def test_output(function_tmpdir, example_data_path): ex_name = "test001e_UZF_3lay" diff --git a/flopy/mf6/data/mfdataplist.py b/flopy/mf6/data/mfdataplist.py index c5adfb6e4..bbef1ae15 100644 --- a/flopy/mf6/data/mfdataplist.py +++ b/flopy/mf6/data/mfdataplist.py @@ -753,7 +753,16 @@ def set_data(self, data, autofill=False, check_data=True, append=False): # make sure columns are still in correct order data = pandas.DataFrame(data, columns=self._header_names) elif isinstance(data, pandas.DataFrame): - if len(data.columns) != len(self._header_names): + if len(data.columns) == len(self._data_item_names) and len( + self._data_item_names + ) != len(self._header_names): + # data supplied with cellids as tuples (data_item_names format), + # consistent with how recarrays are handled above + if list(data.columns) != self._data_item_names: + data = data.set_axis(self._data_item_names, axis=1) + data = self._untuple_cellids(data)[0] + data = pandas.DataFrame(data, columns=self._header_names) + elif len(data.columns) != len(self._header_names): message = ( f"ERROR: Data list {self._data_name} supplied the " f"wrong number of columns of data, expected " @@ -775,8 +784,9 @@ def set_data(self, data, autofill=False, check_data=True, append=False): message, self._simulation_data.debug, ) - # set correct data header names - data = data.set_axis(self._header_names, axis=1) + else: + # set correct data header names + data = data.set_axis(self._header_names, axis=1) else: message = ( f"ERROR: Data list {self._data_name} is an unsupported type: " From 511cebffbb1c85e6f8025dd6215c114d94e4e2e8 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Mon, 8 Jun 2026 17:57:42 -0700 Subject: [PATCH 2/2] ruff --- autotest/test_mf6.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autotest/test_mf6.py b/autotest/test_mf6.py index 69fcc0f06..4a73f90ba 100644 --- a/autotest/test_mf6.py +++ b/autotest/test_mf6.py @@ -1475,7 +1475,7 @@ def test_set_data_dataframe_column_mismatch_error(function_tmpdir): def test_set_data_dataframe_tupled_cellid(function_tmpdir): - """DataFrame with a single tupled 'cellid' column is accepted, consistent with recarrays.""" + """DataFrame with a tuple 'cellid' is accepted, consistent with recarrays.""" sim = MFSimulation(sim_ws=str(function_tmpdir), exe_name="mf6") ModflowTdis(sim, nper=1, perioddata=[(1.0, 1, 1.0)]) ModflowIms(sim)