Skip to content

Commit 1eedc5c

Browse files
authored
Fix wrong order of coordinate converted from pd.series with MultiIndex (#3953)
* Fix 3951 * lint * black * Updata whatsnew
1 parent f07adb2 commit 1eedc5c

File tree

4 files changed

+19
-6
lines changed

4 files changed

+19
-6
lines changed

doc/whats-new.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ New Features
5858

5959
Bug fixes
6060
~~~~~~~~~
61+
- Fix wrong order in converting a ``pd.Series`` with a MultiIndex to ``DataArray``. (:issue:`3951`)
62+
By `Keisuke Fujii <https://github.com/fujiisoup>`_.
6163
- Fix renaming of coords when one or more stacked coords is not in
6264
sorted order during stack+groupby+apply operations. (:issue:`3287`,
6365
:pull:`3906`) By `Spencer Hill <https://github.com/spencerahill>`_

xarray/core/dataset.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4604,8 +4604,7 @@ def from_dataframe(cls, dataframe: pd.DataFrame, sparse: bool = False) -> "Datas
46044604
if not dataframe.columns.is_unique:
46054605
raise ValueError("cannot convert DataFrame with non-unique columns")
46064606

4607-
idx = remove_unused_levels_categories(dataframe.index)
4608-
dataframe = dataframe.set_index(idx)
4607+
idx, dataframe = remove_unused_levels_categories(dataframe.index, dataframe)
46094608
obj = cls()
46104609

46114610
if isinstance(idx, pd.MultiIndex):

xarray/core/indexes.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from .variable import Variable
1010

1111

12-
def remove_unused_levels_categories(index):
12+
def remove_unused_levels_categories(index, dataframe=None):
1313
"""
1414
Remove unused levels from MultiIndex and unused categories from CategoricalIndex
1515
"""
@@ -28,7 +28,11 @@ def remove_unused_levels_categories(index):
2828
index = pd.MultiIndex.from_arrays(levels, names=index.names)
2929
elif isinstance(index, pd.CategoricalIndex):
3030
index = index.remove_unused_categories()
31-
return index
31+
32+
if dataframe is None:
33+
return index
34+
dataframe = dataframe.set_index(index)
35+
return dataframe.index, dataframe
3236

3337

3438
class Indexes(collections.abc.Mapping):

xarray/tests/test_dataarray.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3515,6 +3515,14 @@ def test_to_and_from_series(self):
35153515
expected_da, DataArray.from_series(actual).drop_vars(["x", "y"])
35163516
)
35173517

3518+
def test_from_series_multiindex(self):
3519+
# GH:3951
3520+
df = pd.DataFrame({"B": [1, 2, 3], "A": [4, 5, 6]})
3521+
df = df.rename_axis("num").rename_axis("alpha", axis=1)
3522+
actual = df.stack("alpha").to_xarray()
3523+
assert (actual.sel(alpha="B") == [1, 2, 3]).all()
3524+
assert (actual.sel(alpha="A") == [4, 5, 6]).all()
3525+
35183526
@requires_sparse
35193527
def test_from_series_sparse(self):
35203528
import sparse
@@ -4524,7 +4532,7 @@ def test_argmax(self, x, minindex, maxindex, nanindex):
45244532

45254533
def test_idxmin(self, x, minindex, maxindex, nanindex):
45264534
ar0 = xr.DataArray(
4527-
x, dims=["x"], coords={"x": np.arange(x.size) * 4}, attrs=self.attrs,
4535+
x, dims=["x"], coords={"x": np.arange(x.size) * 4}, attrs=self.attrs
45284536
)
45294537

45304538
# dim doesn't exist
@@ -4620,7 +4628,7 @@ def test_idxmin(self, x, minindex, maxindex, nanindex):
46204628

46214629
def test_idxmax(self, x, minindex, maxindex, nanindex):
46224630
ar0 = xr.DataArray(
4623-
x, dims=["x"], coords={"x": np.arange(x.size) * 4}, attrs=self.attrs,
4631+
x, dims=["x"], coords={"x": np.arange(x.size) * 4}, attrs=self.attrs
46244632
)
46254633

46264634
# dim doesn't exist

0 commit comments

Comments
 (0)