Skip to content

Commit 571a664

Browse files
committed
BUG: count_level did not handle zero-length data case, caused segfault with NumPy < 1.6 for some.
Fixes GH #169
1 parent d2484b9 commit 571a664

File tree

4 files changed

+20
-1
lines changed

4 files changed

+20
-1
lines changed

pandas/core/frame.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2317,6 +2317,11 @@ def _count_level(self, level, axis=0, numeric_only=False):
23172317

23182318
level_index = axis_index.levels[level]
23192319

2320+
if len(self) == 0:
2321+
return DataFrame(np.zeros((len(level_index),
2322+
len(self.columns)), dtype=int),
2323+
index=level_index, columns=self.columns)
2324+
23202325
n = len(level_index)
23212326
locs = axis_index.labels[level].searchsorted(np.arange(n))
23222327

pandas/core/series.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,9 @@ def _count_level(self, level):
493493

494494
level_index = obj.index.levels[level]
495495

496+
if len(self) == 0:
497+
return Series(0, index=level_index)
498+
496499
n = len(level_index)
497500
locs = obj.index.labels[level].searchsorted(np.arange(n))
498501

pandas/tests/test_multilevel.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,18 @@ def _check_counts(frame, axis=0):
252252
df = tm.makeTimeDataFrame()
253253
self.assertRaises(Exception, df.count, level=0)
254254

255+
def test_count_level_corner(self):
256+
s = self.frame['A'][:0]
257+
result = s.count(level=0)
258+
expected = Series(0, index=s.index.levels[0])
259+
assert_series_equal(result, expected)
260+
261+
df = self.frame[:0]
262+
result = df.count(level=0)
263+
expected = DataFrame({}, index=s.index.levels[0],
264+
columns=df.columns).fillna(0).astype(int)
265+
assert_frame_equal(result, expected)
266+
255267
def test_unstack(self):
256268
# just check that it works for now
257269
unstacked = self.ymd.unstack()

scripts/bench_join.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ def do_outer_join_multi(a, b, av, bv):
8686
_, bk = bv.shape
8787
result_index, rindexer, lindexer = lib.outer_join_indexer(a, b)
8888
result = np.empty((ak + bk, len(result_index)), dtype=np.float64)
89-
9089
lib.take_axis0(av, rindexer, out=result[:ak].T)
9190
lib.take_axis0(bv, lindexer, out=result[ak:].T)
9291
return result_index, result

0 commit comments

Comments
 (0)