Skip to content

Commit c2e8aaa

Browse files
committed
Merge branch 'Fix-GH7885' of https://github.com/jmorris0x0/pandas into jmorris0x0-Fix-GH7885
2 parents 12248ff + 5254e52 commit c2e8aaa

File tree

3 files changed

+28
-12
lines changed

3 files changed

+28
-12
lines changed

doc/source/v0.15.0.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ Enhancements
480480

481481

482482

483-
483+
- Bug in ``DataFrame.groupby`` where ``Grouper`` does not recognize level when frequency is specified (:issue:`7885`)
484484

485485

486486

pandas/core/groupby.py

+5-11
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ def _set_grouper(self, obj, sort=False):
248248
key = self.key
249249
if key not in obj._info_axis:
250250
raise KeyError("The grouper name {0} is not found".format(key))
251-
ax = Index(obj[key],name=key)
251+
ax = Index(obj[key], name=key)
252252

253253
else:
254254
ax = obj._get_axis(self.axis)
@@ -258,18 +258,12 @@ def _set_grouper(self, obj, sort=False):
258258
# if a level is given it must be a mi level or
259259
# equivalent to the axis name
260260
if isinstance(ax, MultiIndex):
261-
262-
if isinstance(level, compat.string_types):
263-
if obj.index.name != level:
264-
raise ValueError('level name %s is not the name of the '
265-
'index' % level)
266-
elif level > 0:
267-
raise ValueError('level > 0 only valid with MultiIndex')
268-
ax = Index(ax.get_level_values(level), name=level)
261+
level = ax._get_level_number(level)
262+
ax = Index(ax.get_level_values(level), name=ax.names[level])
269263

270264
else:
271-
if not (level == 0 or level == ax.name):
272-
raise ValueError("The grouper level {0} is not valid".format(level))
265+
if level not in (0, ax.name):
266+
raise ValueError("The level {0} is not valid".format(level))
273267

274268
# possibly sort
275269
if (self.sort or sort) and not ax.is_monotonic:

pandas/tests/test_groupby.py

+22
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,28 @@ def test_grouper_index_types(self):
351351
df.index = list(reversed(df.index.tolist()))
352352
df.groupby(list('abcde')).apply(lambda x: x)
353353

354+
def test_grouper_multilevel_freq(self):
355+
356+
# GH 7885
357+
# with level and freq specified in a pd.Grouper
358+
from datetime import date, timedelta
359+
d0 = date.today() - timedelta(days=14)
360+
dates = date_range(d0, date.today())
361+
date_index = pd.MultiIndex.from_product([dates, dates], names=['foo', 'bar'])
362+
df = pd.DataFrame(np.random.randint(0, 100, 225), index=date_index)
363+
364+
# Check string level
365+
expected = df.reset_index().groupby([pd.Grouper(key='foo', freq='W'),
366+
pd.Grouper(key='bar', freq='W')]).sum()
367+
result = df.groupby([pd.Grouper(level='foo', freq='W'),
368+
pd.Grouper(level='bar', freq='W')]).sum()
369+
assert_frame_equal(result, expected)
370+
371+
# Check integer level
372+
result = df.groupby([pd.Grouper(level=0, freq='W'),
373+
pd.Grouper(level=1, freq='W')]).sum()
374+
assert_frame_equal(result, expected)
375+
354376
def test_grouper_iter(self):
355377
self.assertEqual(sorted(self.df.groupby('A').grouper), ['bar', 'foo'])
356378

0 commit comments

Comments
 (0)