Skip to content

Commit 060ae8f

Browse files
committed
BUG: enable multiple column selection in SparseDataFrame via __getitem__ close #1585
1 parent 77b49b9 commit 060ae8f

File tree

3 files changed

+23
-12
lines changed

3 files changed

+23
-12
lines changed

RELEASE.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ pandas 0.8.1
5656
entry (#1586)
5757
- Fix resampling of tz-aware time series with "anchored" freq (#1591)
5858
- Fix DataFrame.rank error on integer data (#1589)
59+
- Selection of multiple SparseDataFrame columns by list in __getitem__ (#1585)
5960

6061
pandas 0.8.0
6162
============

pandas/sparse/frame.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
from pandas.sparse.series import SparseSeries
2121
from pandas.util.decorators import Appender
22+
import pandas.lib as lib
2223

2324

2425
class _SparseMockBlockManager(object):
@@ -314,26 +315,28 @@ def _set_columns(self, cols):
314315
index = property(fget=_get_index, fset=_set_index)
315316
columns = property(fget=_get_columns, fset=_set_columns)
316317

317-
def __getitem__(self, item):
318+
def __getitem__(self, key):
318319
"""
319320
Retrieve column or slice from DataFrame
320321
"""
321322
try:
322323
# unsure about how kludgy this is
323-
s = self._series[item]
324-
s.name = item
324+
s = self._series[key]
325+
s.name = key
325326
return s
326327
except (TypeError, KeyError):
327-
if isinstance(item, slice):
328-
date_rng = self.index[item]
328+
if isinstance(key, slice):
329+
date_rng = self.index[key]
329330
return self.reindex(date_rng)
330331

331-
elif isinstance(item, np.ndarray):
332-
if len(item) != len(self.index):
333-
raise Exception('Item wrong length %d instead of %d!' %
334-
(len(item), len(self.index)))
335-
newIndex = self.index[item]
336-
return self.reindex(newIndex)
332+
elif isinstance(key, (np.ndarray, list)):
333+
if isinstance(key, list):
334+
key = lib.list_to_object_array(key)
335+
336+
# also raises Exception if object array with NA values
337+
if com._is_bool_indexer(key):
338+
key = np.asarray(key, dtype=bool)
339+
return self._getitem_array(key)
337340
else: # pragma: no cover
338341
raise
339342

pandas/sparse/tests/test_sparse.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -892,7 +892,14 @@ def test_scalar_ops(self):
892892
pass
893893

894894
def test_getitem(self):
895-
pass
895+
# #1585 select multiple columns
896+
sdf = SparseDataFrame(index=[0, 1, 2], columns=['a', 'b','c'])
897+
898+
result = sdf[['a', 'b']]
899+
exp = sdf.reindex(columns=['a', 'b'])
900+
assert_sp_frame_equal(result, exp)
901+
902+
self.assertRaises(Exception, sdf.__getitem__, ['a', 'd'])
896903

897904
def test_set_value(self):
898905
res = self.frame.set_value('foobar', 'B', 1.5)

0 commit comments

Comments
 (0)