Skip to content

Commit be317dd

Browse files
committed
ENH: groupby missing data in index (pandas-dev#28097)
1 parent 0c9089e commit be317dd

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

doc/source/whatsnew/v1.0.0.rst

+2
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,8 @@ Plotting
401401
Groupby/resample/rolling
402402
^^^^^^^^^^^^^^^^^^^^^^^^
403403

404+
-
405+
- Bug in :meth:`DataFrame.groupby` with multiple groups where an ``IndexError`` would be raised if any group contained all NA values (:issue:`20519`)
404406
- Bug in :meth:`DataFrame.rolling` not allowing for rolling over datetimes when ``axis=1`` (:issue: `28192`)
405407
- Bug in :meth:`DataFrame.rolling` not allowing rolling over multi-index levels (:issue: `15584`).
406408
- Bug in :meth:`DataFrame.rolling` not allowing rolling on monotonic decreasing time indexes (:issue: `19248`).

pandas/core/indexes/multi.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1308,10 +1308,10 @@ def _get_grouper_for_level(self, mapper, level):
13081308
# Remove unobserved levels from level_index
13091309
level_index = level_index.take(uniques)
13101310

1311-
if not level_index.tolist():
1312-
grouper = level_index
1313-
else:
1311+
if len(level_index):
13141312
grouper = level_index.take(codes)
1313+
else:
1314+
grouper = level_index.take(codes, fill_value=True)
13151315

13161316
return grouper, codes, level_index
13171317

pandas/tests/groupby/test_grouping.py

+18
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,24 @@ def test_groupby_empty(self):
628628
# check name
629629
assert s.groupby(s).grouper.names == ["name"]
630630

631+
def test_groupby_level_index_value_all_na(self):
632+
# issue 20519
633+
df = DataFrame(
634+
[["x", np.nan, 10], [None, np.nan, 20]], columns=["A", "B", "C"]
635+
).set_index(["A", "B"])
636+
result = df.groupby(level=["A", "B"]).sum()
637+
expected = DataFrame(
638+
data=[],
639+
index=MultiIndex(
640+
levels=[Index(["x"], dtype="object"), Index([], dtype="float64")],
641+
codes=[[], []],
642+
names=["A", "B"],
643+
),
644+
columns=["C"],
645+
dtype="int64",
646+
)
647+
tm.assert_frame_equal(result, expected)
648+
631649

632650
# get_group
633651
# --------------------------------

0 commit comments

Comments
 (0)