Skip to content

Commit 1126cba

Browse files
committed
BUG: fix segfault in SeriesGrouper with non-contiguous index
1 parent e1b6e44 commit 1126cba

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

pandas/src/reduce.pyx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ cdef class Slider:
334334
'''
335335
cdef:
336336
ndarray values, buf
337-
Py_ssize_t stride, orig_len
337+
Py_ssize_t stride, orig_len, orig_stride
338338
char *orig_data
339339

340340
def __init__(self, object values, object buf):
@@ -345,12 +345,14 @@ cdef class Slider:
345345
assert(values.dtype == buf.dtype)
346346
self.values = values
347347
self.buf = buf
348-
self.stride = values.dtype.itemsize
348+
self.stride = values.strides[0]
349349

350350
self.orig_data = self.buf.data
351351
self.orig_len = self.buf.shape[0]
352+
self.orig_stride = self.buf.strides[0]
352353

353354
self.buf.data = self.values.data
355+
self.buf.strides[0] = self.stride
354356

355357
cpdef advance(self, Py_ssize_t k):
356358
self.buf.data = <char*> self.buf.data + self.stride * k
@@ -361,6 +363,7 @@ cdef class Slider:
361363
cpdef cleanup(self):
362364
self.buf.shape[0] = self.orig_len
363365
self.buf.data = self.orig_data
366+
self.buf.strides[0] = self.orig_stride
364367

365368
def reduce(arr, f, axis=0, dummy=None, labels=None):
366369
if labels._has_complex_internals:

pandas/tests/test_groupby.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1503,6 +1503,19 @@ def test_cython_grouper_series_bug_noncontig(self):
15031503
result = obj.groupby(inds).agg(Series.median)
15041504
self.assert_(result.isnull().all())
15051505

1506+
def test_series_grouper_noncontig_index(self):
1507+
index = Index([tm.rands(10) for _ in xrange(100)])
1508+
1509+
values = Series(np.random.randn(50), index=index[::2])
1510+
labels = np.random.randint(0, 5, 50)
1511+
1512+
# it works!
1513+
grouped = values.groupby(labels)
1514+
1515+
# accessing the index elements causes segfault
1516+
f = lambda x: len(set(map(id, x.index)))
1517+
grouped.agg(f)
1518+
15061519
def test_convert_objects_leave_decimal_alone(self):
15071520
from decimal import Decimal
15081521

@@ -2061,6 +2074,9 @@ def test_groupby_categorical_no_compress(self):
20612074
exp = data.groupby(labels).mean().reindex(cats.levels)
20622075
assert_series_equal(result, exp)
20632076

2077+
2078+
2079+
20642080
def _check_groupby(df, result, keys, field, f=lambda x: x.sum()):
20652081
tups = map(tuple, df[keys].values)
20662082
tups = com._asarray_tuplesafe(tups)

0 commit comments

Comments
 (0)