Skip to content

Commit d9035b1

Browse files
committed
BUG: work around numpy zero-length boolean indexing bug. close #2096
1 parent d90d41a commit d9035b1

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

RELEASE.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ pandas 0.9.1
6262
- Fix Timestamp indexing bug in DatetimeIndex.insert (#2155)
6363
- Use index name(s) (if any) in DataFrame.to_records (#2161)
6464
- Don't lose index names in Panel.to_frame/DataFrame.to_panel (#2163)
65+
- Work around length-0 boolean indexing NumPy bug (#2096)
6566
6667
pandas 0.9.0
6768
============

pandas/core/indexing.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,15 @@ def _setitem_with_indexer(self, indexer, value):
120120
try:
121121
for item in item_labels[het_idx]:
122122
data = self.obj[item]
123-
data.values[plane_indexer] = value
123+
values = data.values
124+
if np.prod(values.shape):
125+
values[plane_indexer] = value
124126
except ValueError:
125127
for item, v in zip(item_labels[het_idx], value):
126128
data = self.obj[item]
127-
data.values[plane_indexer] = v
129+
values = data.values
130+
if np.prod(values.shape):
131+
values[plane_indexer] = v
128132
else:
129133
if isinstance(indexer, tuple):
130134
indexer = _maybe_convert_ix(*indexer)
@@ -135,7 +139,10 @@ def _setitem_with_indexer(self, indexer, value):
135139
if isinstance(value, DataFrame):
136140
value = self._align_frame(indexer, value)
137141

138-
self.obj.values[indexer] = value
142+
# 2096
143+
values = self.obj.values
144+
if np.prod(values.shape):
145+
values[indexer] = value
139146

140147
def _align_series(self, indexer, ser):
141148
# indexer to assign Series can be tuple or scalar

pandas/tests/test_frame.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,18 @@ def test_getitem_boolean_iadd(self):
163163

164164
assert_almost_equal(df.values, arr)
165165

166+
def test_boolean_index_empty_corner(self):
167+
# #2096
168+
from pandas import DatetimeIndex
169+
blah = DataFrame(np.empty([0, 1]), columns=['A'],
170+
index=DatetimeIndex([]))
171+
172+
# both of these should succeed trivially
173+
k = np.array([], bool)
174+
175+
blah[k]
176+
blah[k] = 0
177+
166178
def test_getitem_ix_mixed_integer(self):
167179
df = DataFrame(np.random.randn(4, 3),
168180
index=[1, 10, 'C', 'E'], columns=[1, 2, 3])

0 commit comments

Comments
 (0)