Skip to content

Commit

Permalink
FIX-#7143: Constructing a DataFrame from a Modin Series with tuple na…
Browse files Browse the repository at this point in the history
…me should produce MultiIndex columns (#7214)

Signed-off-by: Jonathan Shi <jhshi07@gmail.com>
  • Loading branch information
noloerino committed Apr 25, 2024
1 parent 9ca33b4 commit 199e3fd
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 1 deletion.
6 changes: 5 additions & 1 deletion modin/pandas/series.py
Expand Up @@ -185,7 +185,11 @@ def _set_name(self, name: Hashable) -> None:
"""
if name is None:
name = MODIN_UNNAMED_SERIES_LABEL
self._query_compiler.columns = [name]
if isinstance(name, tuple):
columns = pandas.MultiIndex.from_tuples(tuples=[name])
else:
columns = [name]
self._query_compiler.columns = columns

name: Hashable = property(_get_name, _set_name)
_parent = None
Expand Down
10 changes: 10 additions & 0 deletions modin/tests/pandas/dataframe/test_default.py
Expand Up @@ -1485,3 +1485,13 @@ def test_setattr_axes():
def test_attrs(data):
modin_df, pandas_df = create_test_dfs(data)
eval_general(modin_df, pandas_df, lambda df: df.attrs)


def test_df_from_series_with_tuple_name():
# Tests that creating a DataFrame from a series with a tuple name results in
# a DataFrame with MultiIndex columns.
pandas_result = pandas.DataFrame(pandas.Series(name=("a", 1)))
# 1. Creating a Modin DF from native pandas Series
df_equals(pd.DataFrame(pandas.Series(name=("a", 1))), pandas_result)
# 2. Creating a Modin DF from Modin Series
df_equals(pd.DataFrame(pd.Series(name=("a", 1))), pandas_result)
17 changes: 17 additions & 0 deletions modin/tests/pandas/test_series.py
Expand Up @@ -2642,6 +2642,23 @@ def test_name(data):
assert modin_series._query_compiler.columns == ["New_name"]


def test_tuple_name():
names = [("a", 1), ("a", "b", "c"), "flat"]
s = pd.Series(name=names[0])
# The internal representation of the Series stores the name as a column label.
# When it is a tuple, this label is a MultiIndex object, and this test ensures that
# the Series's name property remains a tuple.
assert s.name == names[0]
assert isinstance(s.name, tuple)
# Setting the name to a tuple of a different level or a non-tuple should not error.
s.name = names[1]
assert s.name == names[1]
assert isinstance(s.name, tuple)
s.name = names[2]
assert s.name == names[2]
assert isinstance(s.name, str)


@pytest.mark.parametrize("data", test_data_values, ids=test_data_keys)
def test_nbytes(data):
modin_series, pandas_series = create_test_series(data)
Expand Down

0 comments on commit 199e3fd

Please sign in to comment.