Skip to content

Commit a4b0a2e

Browse files
committed
BUG: fix bugs related to comments in #371
1 parent 33b816d commit a4b0a2e

File tree

4 files changed

+45
-3
lines changed

4 files changed

+45
-3
lines changed

RELEASE.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ pandas 0.7.0
148148
yielding an aggregated result with hierarchical columns (GH #166)
149149
- Monkey-patch context to traceback in ``DataFrame.apply`` to indicate which
150150
row/column the function application failed on (GH #614)
151+
- Improved ability of read_table and read_clipboard to parse
152+
console-formatted DataFrames (can read the row of index names, etc.)
151153

152154
**Bug fixes**
153155

pandas/core/frame.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,9 +1415,17 @@ def xs(self, key, axis=0, level=None, copy=True):
14151415
"""
14161416
labels = self._get_axis(axis)
14171417
if level is not None:
1418-
indexer = [slice(None, None)] * 2
1419-
indexer[axis] = labels.get_loc_level(key, level=level)
1420-
result = self.ix[tuple(indexer)]
1418+
loc = labels.get_loc_level(key, level=level)
1419+
1420+
# level = 0
1421+
if not isinstance(loc, slice):
1422+
indexer = [slice(None, None)] * 2
1423+
indexer[axis] = loc
1424+
indexer = tuple(indexer)
1425+
else:
1426+
indexer = loc
1427+
1428+
result = self.ix[indexer]
14211429
new_ax = result._get_axis(axis).droplevel(level)
14221430
setattr(result, result._get_axis_name(axis), new_ax)
14231431
return result

pandas/core/index.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1640,6 +1640,9 @@ def _partial_tup_index(self, tup, side='left'):
16401640
section = labs[start:end]
16411641

16421642
if lab not in lev:
1643+
if lib.infer_dtype([lab]) != lev.inferred_type:
1644+
raise Exception('Level type mismatch: %s' % lab)
1645+
16431646
# short circuit
16441647
loc = lev.searchsorted(lab, side=side)
16451648
if side == 'right' and loc >= 0:

pandas/tests/test_multilevel.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,19 @@ def test_series_setitem(self):
201201
def test_series_slice_partial(self):
202202
pass
203203

204+
def test_frame_getitem_setitem_slice(self):
205+
# getitem
206+
result = self.frame.ix[:4]
207+
expected = self.frame[:4]
208+
assert_frame_equal(result, expected)
209+
210+
# setitem
211+
cp = self.frame.copy()
212+
cp.ix[:4] = 0
213+
214+
self.assert_((cp.values[:4] == 0).all())
215+
self.assert_((cp.values[4:] != 0).all())
216+
204217
def test_xs(self):
205218
xs = self.frame.xs(('bar', 'two'))
206219
xs2 = self.frame.ix[('bar', 'two')]
@@ -230,6 +243,22 @@ def test_xs_level(self):
230243
expected.index = expected.index.droplevel(2)
231244
assert_frame_equal(result, expected)
232245

246+
def test_xs_level0(self):
247+
from pandas import read_table
248+
from StringIO import StringIO
249+
text = """ A B C D E
250+
one two three four
251+
a b 10.0032 5 -0.5109 -2.3358 -0.4645 0.05076 0.3640
252+
a q 20 4 0.4473 1.4152 0.2834 1.00661 0.1744
253+
x q 30 3 -0.6662 -0.5243 -0.3580 0.89145 2.5838"""
254+
255+
df = read_table(StringIO(text), sep='\s+')
256+
257+
result = df.xs('a', level=0)
258+
expected = df.xs('a')
259+
self.assertEqual(len(result), 2)
260+
assert_frame_equal(result, expected)
261+
233262
def test_xs_level_series(self):
234263
s = self.frame['A']
235264
result = s[:, 'two']

0 commit comments

Comments
 (0)