Skip to content

Commit acca735

Browse files
committed
BUG: fixed issues where passing an axis of 'index' would fail (as its expecting an axis number)
1 parent 8988c65 commit acca735

File tree

5 files changed

+76
-36
lines changed

5 files changed

+76
-36
lines changed

RELEASE.rst

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ pandas 0.11.0
3535
DataFrames and propogate in operations
3636
- Add function to pandas.io.data for retrieving stock index components from
3737
Yahoo! finance (GH2795_)
38-
- Add ``squeeze`` function to reduce dimensionality of 1-len objects
3938
- Support slicing with time objects (GH2681_)
4039
- Added ``.iloc`` attribute, to support strict integer based indexing, analagous to ``.ix`` (GH2922_)
4140
- Added ``.loc`` attribute, to support strict label based indexing, analagous to ``.ix`` (GH3053_)
@@ -73,10 +72,7 @@ pandas 0.11.0
7372
- New keywords ``iterator=boolean``, and ``chunksize=number_in_a_chunk`` are
7473
provided to support iteration on ``select`` and ``select_as_multiple`` (GH3076_)
7574

76-
- In ``HDFStore``, provide dotted attribute access to ``get`` from stores
77-
(e.g. ``store.df == store['df']``)
78-
79-
- ``Squeeze`` to possibly remove length 1 dimensions from an object.
75+
- Add ``squeeze`` method to possibly remove length 1 dimensions from an object.
8076

8177
.. ipython:: python
8278
@@ -209,7 +205,6 @@ pandas 0.11.0
209205
other values), (GH2850_)
210206
- Unstack of a frame with no nans would always cause dtype upcasting (GH2929_)
211207
- Fix scalar datetime.datetime parsing bug in read_csv (GH3071_)
212-
- Timedeltas are now fully operational (closes GH2898_)
213208
- Fixed slow printing of large Dataframes, due to inefficient dtype
214209
reporting (GH2807_)
215210
- Fixed a segfault when using a function as grouper in groupby (GH3035_)
@@ -232,6 +227,7 @@ pandas 0.11.0
232227
- Fix issue with indexing a series with a boolean key and specifiying a 1-len list on the rhs (GH2745_)
233228
- Fixed bug in groupby apply when kernel generate list of arrays having unequal len (GH1738_)
234229
- fixed handling of rolling_corr with center=True which could produce corr>1 (GH3155_)
230+
- Fixed issues where indices can be passed as 'index/column' in addition to 0/1 for the axis parameter
235231

236232
.. _GH622: https://github.com/pydata/pandas/issues/622
237233
.. _GH797: https://github.com/pydata/pandas/issues/797

pandas/core/frame.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2194,6 +2194,7 @@ def xs(self, key, axis=0, level=None, copy=True):
21942194
-------
21952195
xs : Series or DataFrame
21962196
"""
2197+
axis = self._get_axis_number(axis)
21972198
labels = self._get_axis(axis)
21982199
if level is not None:
21992200
loc, new_ax = labels.get_loc_level(key, level=level)
@@ -2340,6 +2341,8 @@ def align(self, other, join='outer', axis=None, level=None, copy=True,
23402341
(left, right) : (DataFrame, type of other)
23412342
Aligned objects
23422343
"""
2344+
if axis is not None:
2345+
axis = self._get_axis_number(axis)
23432346
if isinstance(other, DataFrame):
23442347
return self._align_frame(other, join=join, axis=axis, level=level,
23452348
copy=copy, fill_value=fill_value,
@@ -2522,6 +2525,7 @@ def reindex_axis(self, labels, axis=0, method=None, level=None, copy=True,
25222525
reindexed : same type as calling instance
25232526
"""
25242527
self._consolidate_inplace()
2528+
axis = self._get_axis_number(axis)
25252529
if axis == 0:
25262530
return self._reindex_index(labels, method, copy, level,
25272531
fill_value=fill_value,
@@ -2834,6 +2838,7 @@ def take(self, indices, axis=0, convert=True):
28342838

28352839
# check/convert indicies here
28362840
if convert:
2841+
axis = self._get_axis_number(axis)
28372842
indices = _maybe_convert_indices(indices, len(self._get_axis(axis)))
28382843

28392844
if self._is_mixed_type:
@@ -2922,6 +2927,7 @@ def dropna(self, axis=0, how='any', thresh=None, subset=None):
29222927
subset=subset, axis=ax)
29232928
return result
29242929

2930+
axis = self._get_axis_number(axis)
29252931
if axis == 0:
29262932
agg_axis = 1
29272933
elif axis == 1:
@@ -3089,6 +3095,7 @@ def sort_index(self, axis=0, by=None, ascending=True, inplace=False):
30893095
"""
30903096
from pandas.core.groupby import _lexsort_indexer
30913097

3098+
axis = self._get_axis_number(axis)
30923099
if axis not in [0, 1]:
30933100
raise ValueError('Axis must be 0 or 1, got %s' % str(axis))
30943101

@@ -3159,6 +3166,7 @@ def sortlevel(self, level=0, axis=0, ascending=True, inplace=False):
31593166
-------
31603167
sorted : DataFrame
31613168
"""
3169+
axis = self._get_axis_number(axis)
31623170
the_axis = self._get_axis(axis)
31633171
if not isinstance(the_axis, MultiIndex):
31643172
raise Exception('can only sort by level with a hierarchical index')
@@ -3202,6 +3210,7 @@ def swaplevel(self, i, j, axis=0):
32023210
"""
32033211
result = self.copy()
32043212

3213+
axis = self._get_axis_number(axis)
32053214
if axis == 0:
32063215
result.index = result.index.swaplevel(i, j)
32073216
else:
@@ -3223,6 +3232,7 @@ def reorder_levels(self, order, axis=0):
32233232
-------
32243233
type of caller (new object)
32253234
"""
3235+
axis = self._get_axis_number(axis)
32263236
if not isinstance(self._get_axis(axis),
32273237
MultiIndex): # pragma: no cover
32283238
raise Exception('Can only reorder levels on a hierarchical axis.')
@@ -3274,6 +3284,7 @@ def fillna(self, value=None, method=None, axis=0, inplace=False,
32743284
"""
32753285
self._consolidate_inplace()
32763286

3287+
axis = self._get_axis_number(axis)
32773288
if value is None:
32783289
if method is None:
32793290
raise ValueError('must specify a fill method or value')
@@ -3362,6 +3373,7 @@ def replace(self, to_replace, value=None, method='pad', axis=0,
33623373
"""
33633374
self._consolidate_inplace()
33643375

3376+
axis = self._get_axis_number(axis)
33653377
if inplace:
33663378
import warnings
33673379
warnings.warn("replace with inplace=True will return None"
@@ -4057,6 +4069,7 @@ def apply(self, func, axis=0, broadcast=False, raw=False,
40574069
if len(self.columns) == 0 and len(self.index) == 0:
40584070
return self
40594071

4072+
axis = self._get_axis_number(axis)
40604073
if kwds or args and not isinstance(func, np.ufunc):
40614074
f = lambda x: func(x, *args, **kwds)
40624075
else:
@@ -4478,6 +4491,7 @@ def corrwith(self, other, axis=0, drop=False):
44784491
-------
44794492
correls : Series
44804493
"""
4494+
axis = self._get_axis_number(axis)
44814495
if isinstance(other, Series):
44824496
return self.apply(other.corr, axis=axis)
44834497

@@ -4580,6 +4594,7 @@ def count(self, axis=0, level=None, numeric_only=False):
45804594
-------
45814595
count : Series (or DataFrame if level specified)
45824596
"""
4597+
axis = self._get_axis_number(axis)
45834598
if level is not None:
45844599
return self._count_level(level, axis=axis,
45854600
numeric_only=numeric_only)
@@ -4756,6 +4771,7 @@ def mad(self, axis=0, skipna=True, level=None):
47564771

47574772
frame = self._get_numeric_data()
47584773

4774+
axis = self._get_axis_number(axis)
47594775
if axis == 0:
47604776
demeaned = frame - frame.mean(axis=0)
47614777
else:
@@ -4811,12 +4827,14 @@ def _agg_by_level(self, name, axis=0, level=0, skipna=True, **kwds):
48114827
grouped = self.groupby(level=level, axis=axis)
48124828
if hasattr(grouped, name) and skipna:
48134829
return getattr(grouped, name)(**kwds)
4830+
axis = self._get_axis_number(axis)
48144831
method = getattr(type(self), name)
48154832
applyf = lambda x: method(x, axis=axis, skipna=skipna, **kwds)
48164833
return grouped.aggregate(applyf)
48174834

48184835
def _reduce(self, op, axis=0, skipna=True, numeric_only=None,
48194836
filter_type=None, **kwds):
4837+
axis = self._get_axis_number(axis)
48204838
f = lambda x: op(x, axis=axis, skipna=skipna, **kwds)
48214839
labels = self._get_agg_axis(axis)
48224840
if numeric_only is None:
@@ -4875,6 +4893,7 @@ def idxmin(self, axis=0, skipna=True):
48754893
-------
48764894
idxmin : Series
48774895
"""
4896+
axis = self._get_axis_number(axis)
48784897
indices = nanops.nanargmin(self.values, axis=axis, skipna=skipna)
48794898
index = self._get_axis(axis)
48804899
result = [index[i] if i >= 0 else NA for i in indices]
@@ -4897,6 +4916,7 @@ def idxmax(self, axis=0, skipna=True):
48974916
-------
48984917
idxmax : Series
48994918
"""
4919+
axis = self._get_axis_number(axis)
49004920
indices = nanops.nanargmax(self.values, axis=axis, skipna=skipna)
49014921
index = self._get_axis(axis)
49024922
result = [index[i] if i >= 0 else NA for i in indices]
@@ -5030,6 +5050,7 @@ def rank(self, axis=0, numeric_only=None, method='average',
50305050
-------
50315051
ranks : DataFrame
50325052
"""
5053+
axis = self._get_axis_number(axis)
50335054
if numeric_only is None:
50345055
try:
50355056
ranks = algos.rank(self.values, axis=axis, method=method,
@@ -5070,6 +5091,7 @@ def to_timestamp(self, freq=None, how='start', axis=0, copy=True):
50705091
if copy:
50715092
new_data = new_data.copy()
50725093

5094+
axis = self._get_axis_number(axis)
50735095
if axis == 0:
50745096
new_data.set_axis(1, self.index.to_timestamp(freq=freq, how=how))
50755097
elif axis == 1:
@@ -5100,6 +5122,7 @@ def to_period(self, freq=None, axis=0, copy=True):
51005122
if copy:
51015123
new_data = new_data.copy()
51025124

5125+
axis = self._get_axis_number(axis)
51035126
if axis == 0:
51045127
if freq is None:
51055128
freq = self.index.freqstr or self.index.inferred_freq

pandas/core/generic.py

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,28 +34,29 @@ def load(cls, path):
3434
#----------------------------------------------------------------------
3535
# Axis name business
3636

37-
@classmethod
38-
def _get_axis_number(cls, axis):
39-
axis = cls._AXIS_ALIASES.get(axis, axis)
40-
37+
def _get_axis_number(self, axis):
38+
axis = self._AXIS_ALIASES.get(axis, axis)
4139
if com.is_integer(axis):
42-
if axis in cls._AXIS_NAMES:
40+
if axis in self._AXIS_NAMES:
4341
return axis
44-
else:
45-
raise Exception('No %d axis' % axis)
4642
else:
47-
return cls._AXIS_NUMBERS[axis]
43+
try:
44+
return self._AXIS_NUMBERS[axis]
45+
except:
46+
pass
47+
raise ValueError('No axis named %s' % axis)
4848

49-
@classmethod
50-
def _get_axis_name(cls, axis):
51-
axis = cls._AXIS_ALIASES.get(axis, axis)
49+
def _get_axis_name(self, axis):
50+
axis = self._AXIS_ALIASES.get(axis, axis)
5251
if isinstance(axis, basestring):
53-
if axis in cls._AXIS_NUMBERS:
52+
if axis in self._AXIS_NUMBERS:
5453
return axis
55-
else:
56-
raise Exception('No axis named %s' % axis)
5754
else:
58-
return cls._AXIS_NAMES[axis]
55+
try:
56+
return self._AXIS_NAMES[axis]
57+
except:
58+
pass
59+
raise ValueError('No axis named %s' % axis)
5960

6061
def _get_axis(self, axis):
6162
name = self._get_axis_name(axis)
@@ -147,6 +148,7 @@ def groupby(self, by=None, axis=0, level=None, as_index=True, sort=True,
147148
GroupBy object
148149
"""
149150
from pandas.core.groupby import groupby
151+
axis = self._get_axis_number(axis)
150152
return groupby(self, by, axis=axis, level=level, as_index=as_index,
151153
sort=sort, group_keys=group_keys)
152154

@@ -247,6 +249,7 @@ def resample(self, rule, how=None, axis=0, fill_method=None,
247249
range from 0 through 4. Defaults to 0
248250
"""
249251
from pandas.tseries.resample import TimeGrouper
252+
axis = self._get_axis_number(axis)
250253
sampler = TimeGrouper(rule, label=label, closed=closed, how=how,
251254
axis=axis, kind=kind, loffset=loffset,
252255
fill_method=fill_method, convention=convention,
@@ -925,6 +928,7 @@ def rename_axis(self, mapper, axis=0, copy=True):
925928

926929
mapper_f = _get_rename_function(mapper)
927930

931+
axis = self._get_axis_number(axis)
928932
if axis == 0:
929933
new_data = self._data.rename_items(mapper_f, copydata=copy)
930934
else:
@@ -951,6 +955,7 @@ def take(self, indices, axis=0, convert=True):
951955

952956
# check/convert indicies here
953957
if convert:
958+
axis = self._get_axis_number(axis)
954959
indices = _maybe_convert_indices(indices, len(self._get_axis(axis)))
955960

956961
if axis == 0:

pandas/core/panel.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,7 @@ def xs(self, key, axis=1, copy=True):
10511051
-------
10521052
y : ndim(self)-1
10531053
"""
1054+
axis = self._get_axis_number(axis)
10541055
if axis == 0:
10551056
data = self[key]
10561057
if copy:
@@ -1320,10 +1321,11 @@ def shift(self, lags, axis='major'):
13201321
vslicer = slice(-lags, None)
13211322
islicer = slice(None, lags)
13221323

1323-
if axis == 'major':
1324+
axis = self._get_axis_name(axis)
1325+
if axis == 'major_axis':
13241326
values = values[:, vslicer, :]
13251327
major_axis = major_axis[islicer]
1326-
elif axis == 'minor':
1328+
elif axis == 'minor_axis':
13271329
values = values[:, :, vslicer]
13281330
minor_axis = minor_axis[islicer]
13291331
else:

pandas/tests/test_frame.py

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1766,19 +1766,20 @@ def setUp(self):
17661766
index=['a', 'b', 'c'])
17671767

17681768
def test_get_axis(self):
1769-
self.assert_(DataFrame._get_axis_name(0) == 'index')
1770-
self.assert_(DataFrame._get_axis_name(1) == 'columns')
1771-
self.assert_(DataFrame._get_axis_name('index') == 'index')
1772-
self.assert_(DataFrame._get_axis_name('columns') == 'columns')
1773-
self.assertRaises(Exception, DataFrame._get_axis_name, 'foo')
1774-
self.assertRaises(Exception, DataFrame._get_axis_name, None)
1775-
1776-
self.assert_(DataFrame._get_axis_number(0) == 0)
1777-
self.assert_(DataFrame._get_axis_number(1) == 1)
1778-
self.assert_(DataFrame._get_axis_number('index') == 0)
1779-
self.assert_(DataFrame._get_axis_number('columns') == 1)
1780-
self.assertRaises(Exception, DataFrame._get_axis_number, 2)
1781-
self.assertRaises(Exception, DataFrame._get_axis_number, None)
1769+
f = self.frame
1770+
self.assert_(f._get_axis_name(0) == 'index')
1771+
self.assert_(f._get_axis_name(1) == 'columns')
1772+
self.assert_(f._get_axis_name('index') == 'index')
1773+
self.assert_(f._get_axis_name('columns') == 'columns')
1774+
self.assertRaises(Exception, f._get_axis_name, 'foo')
1775+
self.assertRaises(Exception, f._get_axis_name, None)
1776+
1777+
self.assert_(f._get_axis_number(0) == 0)
1778+
self.assert_(f._get_axis_number(1) == 1)
1779+
self.assert_(f._get_axis_number('index') == 0)
1780+
self.assert_(f._get_axis_number('columns') == 1)
1781+
self.assertRaises(Exception, f._get_axis_number, 2)
1782+
self.assertRaises(Exception, f._get_axis_number, None)
17821783

17831784
self.assert_(self.frame._get_axis(0) is self.frame.index)
17841785
self.assert_(self.frame._get_axis(1) is self.frame.columns)
@@ -8426,6 +8427,19 @@ def test_get_axis_etc(self):
84268427
self.assert_(f._get_axis(1) is f.columns)
84278428
self.assertRaises(Exception, f._get_axis_number, 2)
84288429

8430+
def test_axis_aliases(self):
8431+
8432+
f = self.frame
8433+
8434+
# reg name
8435+
expected = f.sum(axis=0)
8436+
result = f.sum(axis='index')
8437+
assert_series_equal(result, expected)
8438+
8439+
expected = f.sum(axis=1)
8440+
result = f.sum(axis='columns')
8441+
assert_series_equal(result, expected)
8442+
84298443
def test_combine_first_mixed(self):
84308444
a = Series(['a', 'b'], index=range(2))
84318445
b = Series(range(2), index=range(2))

0 commit comments

Comments
 (0)