Skip to content

Commit 228668c

Browse files
authored
fix(mfdataplist): accept DataFrame with tuple cellid (#2767)
Fix an inconsistency mentioned in #2758. pd.DataFrame with a tuple cellid column was rejected by .set_data() while the equivalent recarray form was accepted. Accept tuple cellid for DataFrame too.
1 parent c27af43 commit 228668c

2 files changed

Lines changed: 34 additions & 3 deletions

File tree

autotest/test_mf6.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,6 +1474,27 @@ def test_set_data_dataframe_column_mismatch_error(function_tmpdir):
14741474
spd.set_data({0: df})
14751475

14761476

1477+
def test_set_data_dataframe_tupled_cellid(function_tmpdir):
1478+
"""DataFrame with a tuple 'cellid' is accepted, consistent with recarrays."""
1479+
sim = MFSimulation(sim_ws=str(function_tmpdir), exe_name="mf6")
1480+
ModflowTdis(sim, nper=1, perioddata=[(1.0, 1, 1.0)])
1481+
ModflowIms(sim)
1482+
gwf = ModflowGwf(sim, modelname="gwf")
1483+
ModflowGwfdis(gwf, nlay=1, nrow=10, ncol=10)
1484+
ModflowGwfic(gwf, strt=0.0)
1485+
ModflowGwfnpf(gwf)
1486+
ModflowGwfwel(gwf, stress_period_data={0: [[(0, 0, 0), -1.0]]})
1487+
spd = gwf.get_package("WEL").stress_period_data
1488+
1489+
df = pd.DataFrame({"cellid": [(0, 3, 4)], "q": [-500.0]})
1490+
spd.set_data({0: df})
1491+
result = spd.get_data(key=0)
1492+
assert result is not None
1493+
assert len(result) == 1
1494+
assert result[0]["cellid"] == (0, 3, 4)
1495+
assert result[0]["q"] == pytest.approx(-500.0)
1496+
1497+
14771498
@requires_exe("mf6")
14781499
def test_output(function_tmpdir, example_data_path):
14791500
ex_name = "test001e_UZF_3lay"

flopy/mf6/data/mfdataplist.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -753,7 +753,16 @@ def set_data(self, data, autofill=False, check_data=True, append=False):
753753
# make sure columns are still in correct order
754754
data = pandas.DataFrame(data, columns=self._header_names)
755755
elif isinstance(data, pandas.DataFrame):
756-
if len(data.columns) != len(self._header_names):
756+
if len(data.columns) == len(self._data_item_names) and len(
757+
self._data_item_names
758+
) != len(self._header_names):
759+
# data supplied with cellids as tuples (data_item_names format),
760+
# consistent with how recarrays are handled above
761+
if list(data.columns) != self._data_item_names:
762+
data = data.set_axis(self._data_item_names, axis=1)
763+
data = self._untuple_cellids(data)[0]
764+
data = pandas.DataFrame(data, columns=self._header_names)
765+
elif len(data.columns) != len(self._header_names):
757766
message = (
758767
f"ERROR: Data list {self._data_name} supplied the "
759768
f"wrong number of columns of data, expected "
@@ -775,8 +784,9 @@ def set_data(self, data, autofill=False, check_data=True, append=False):
775784
message,
776785
self._simulation_data.debug,
777786
)
778-
# set correct data header names
779-
data = data.set_axis(self._header_names, axis=1)
787+
else:
788+
# set correct data header names
789+
data = data.set_axis(self._header_names, axis=1)
780790
else:
781791
message = (
782792
f"ERROR: Data list {self._data_name} is an unsupported type: "

0 commit comments

Comments
 (0)