Skip to content

Commit 4be0fd9

Browse files
tptopper-123
tp
authored andcommitted
'index' and 'columns' added to fixture and related changes.
1 parent 3ac8f0b commit 4be0fd9

File tree

6 files changed

+31
-31
lines changed

6 files changed

+31
-31
lines changed

doc/source/whatsnew/v0.24.0.txt

+3-5
Original file line numberDiff line numberDiff line change
@@ -475,11 +475,9 @@ Numeric
475475
- Bug in :class:`Series` ``__rmatmul__`` doesn't support matrix vector multiplication (:issue:`21530`)
476476
- Bug in :func:`factorize` fails with read-only array (:issue:`12813`)
477477
- Fixed bug in :func:`unique` handled signed zeros inconsistently: for some inputs 0.0 and -0.0 were treated as equal and for some inputs as different. Now they are treated as equal for all inputs (:issue:`21866`)
478-
- Bug in :meth:`DataFrame.agg`, :meth:`DataFrame.transform` and :meth:`DataFrame.apply` when ``axis=1``.
479-
Using ``apply`` with a list of functions and axis=1 (e.g. ``df.apply(['abs'], axis=1)``)
480-
previously gave a TypeError. This fixes that issue.
481-
As ``agg`` and ``transform`` in some cases delegate to ``apply``, this also
482-
fixed this issue for them (:issue:`16679`).
478+
- Bug in :meth:`DataFrame.agg`, :meth:`DataFrame.transform` and :meth:`DataFrame.apply` where,
479+
when supplied with a list of functions and ``axis=1`` (e.g. ``df.apply(['sum', 'mean'], axis=1)``),
480+
a ``TypeError`` was wrongly raised. For all three methods such calculation are now done correctly. (:issue:`16679`).
483481
-
484482

485483
Strings

pandas/conftest.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,16 @@ def spmatrix(request):
6060
return getattr(sparse, request.param + '_matrix')
6161

6262

63-
@pytest.fixture(params=[0, 1],
64-
ids=lambda x: "axis {}".format(x))
63+
@pytest.fixture(params=[0, 1, 'index', 'columns'],
64+
ids=lambda x: "axis {!r}".format(x))
6565
def axis(request):
6666
"""
6767
Fixture for returning the axis numbers of a dataframe.
6868
"""
6969
return request.param
7070

7171

72-
@pytest.fixture(params=[0], ids=lambda x: "axis {}".format(x))
72+
@pytest.fixture(params=[0, 'index'], ids=lambda x: "axis {!r}".format(x))
7373
def axis_series(request):
7474
"""
7575
Fixture for returning the axis numbers of a series.

pandas/core/apply.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from pandas.core.dtypes.generic import ABCSeries
66
from pandas.core.dtypes.common import (
77
is_extension_type,
8+
is_dict_like,
9+
is_list_like,
810
is_sequence)
911
from pandas.util._decorators import cache_readonly
1012

@@ -106,7 +108,7 @@ def get_result(self):
106108
""" compute the results """
107109

108110
# dispatch to agg
109-
if isinstance(self.f, (list, dict)):
111+
if is_list_like(self.f) or is_dict_like(self.f):
110112
return self.obj.aggregate(self.f, axis=self.axis,
111113
*self.args, **self.kwds)
112114

pandas/core/frame.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -6079,7 +6079,7 @@ def aggregate(self, func, axis=0, *args, **kwargs):
60796079
return result
60806080

60816081
def _aggregate(self, arg, axis=0, *args, **kwargs):
6082-
if axis == 1:
6082+
if axis in {1, 'columns'}:
60836083
result, how = (super(DataFrame, self.T)
60846084
._aggregate(arg, *args, **kwargs))
60856085
result = result.T if result is not None else result
@@ -6089,7 +6089,7 @@ def _aggregate(self, arg, axis=0, *args, **kwargs):
60896089
agg = aggregate
60906090

60916091
def transform(self, func, axis=0, *args, **kwargs):
6092-
if axis == 1:
6092+
if axis in {1, 'columns'}:
60936093
return super(DataFrame, self.T).transform(func, *args, **kwargs).T
60946094
return super(DataFrame, self).transform(func, *args, **kwargs)
60956095

pandas/tests/frame/test_apply.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,7 @@ def zip_frames(frames, axis=1):
869869
class TestDataFrameAggregate(TestData):
870870

871871
def test_agg_transform(self, axis):
872-
other_axis = abs(axis - 1)
872+
other_axis = 1 if axis in {0, 'index'} else 0
873873

874874
with np.errstate(all='ignore'):
875875

@@ -890,7 +890,7 @@ def test_agg_transform(self, axis):
890890
# list-like
891891
result = self.frame.apply([np.sqrt], axis=axis)
892892
expected = f_sqrt.copy()
893-
if axis == 0:
893+
if axis in {0, 'index'}:
894894
expected.columns = pd.MultiIndex.from_product(
895895
[self.frame.columns, ['sqrt']])
896896
else:
@@ -906,7 +906,7 @@ def test_agg_transform(self, axis):
906906
# functions per series and then concatting
907907
result = self.frame.apply([np.abs, np.sqrt], axis=axis)
908908
expected = zip_frames([f_abs, f_sqrt], axis=other_axis)
909-
if axis == 0:
909+
if axis in {0, 'index'}:
910910
expected.columns = pd.MultiIndex.from_product(
911911
[self.frame.columns, ['absolute', 'sqrt']])
912912
else:
@@ -1001,7 +1001,7 @@ def test_agg_dict_nested_renaming_depr(self):
10011001
'B': {'bar': 'max'}})
10021002

10031003
def test_agg_reduce(self, axis):
1004-
other_axis = abs(axis - 1)
1004+
other_axis = 1 if axis in {0, 'index'} else 0
10051005
name1, name2 = self.frame.axes[other_axis].unique()[:2].sort_values()
10061006

10071007
# all reducers
@@ -1010,7 +1010,7 @@ def test_agg_reduce(self, axis):
10101010
self.frame.sum(axis=axis),
10111011
], axis=1)
10121012
expected.columns = ['mean', 'max', 'sum']
1013-
expected = expected.T if axis == 0 else expected
1013+
expected = expected.T if axis in {0, 'index'} else expected
10141014

10151015
result = self.frame.agg(['mean', 'max', 'sum'], axis=axis)
10161016
assert_frame_equal(result, expected)
@@ -1031,7 +1031,7 @@ def test_agg_reduce(self, axis):
10311031
index=['mean']),
10321032
name2: Series([self.frame.loc(other_axis)[name2].sum()],
10331033
index=['sum'])})
1034-
expected = expected.T if axis == 1 else expected
1034+
expected = expected.T if axis in {1, 'columns'} else expected
10351035
assert_frame_equal(result, expected)
10361036

10371037
# dict input with lists with multiple
@@ -1045,7 +1045,7 @@ def test_agg_reduce(self, axis):
10451045
self.frame.loc(other_axis)[name2].max()],
10461046
index=['sum', 'max'])),
10471047
]))
1048-
expected = expected.T if axis == 1 else expected
1048+
expected = expected.T if axis in {1, 'columns'} else expected
10491049
assert_frame_equal(result, expected)
10501050

10511051
def test_nuiscance_columns(self):

pandas/tests/generic/test_label_or_level_utils.py

+13-13
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def test_is_level_or_label_reference_df_simple(df_levels, axis):
8282
expected_labels, expected_levels = get_labels_levels(df_levels)
8383

8484
# Transpose frame if axis == 1
85-
if axis == 1:
85+
if axis in {1, 'columns'}:
8686
df_levels = df_levels.T
8787

8888
# Perform checks
@@ -93,7 +93,7 @@ def test_is_level_or_label_reference_df_simple(df_levels, axis):
9393
def test_is_level_reference_df_ambig(df_ambig, axis):
9494

9595
# Transpose frame if axis == 1
96-
if axis == 1:
96+
if axis in {1, 'columns'}:
9797
df_ambig = df_ambig.T
9898

9999
# df has both an on-axis level and off-axis label named L1
@@ -166,7 +166,7 @@ def test_is_label_or_level_reference_panel_error(panel):
166166
def test_check_label_or_level_ambiguity_df(df_ambig, axis):
167167

168168
# Transpose frame if axis == 1
169-
if axis == 1:
169+
if axis in {1, 'columns'}:
170170
df_ambig = df_ambig.T
171171

172172
# df_ambig has both an on-axis level and off-axis label named L1
@@ -176,7 +176,7 @@ def test_check_label_or_level_ambiguity_df(df_ambig, axis):
176176

177177
assert df_ambig._check_label_or_level_ambiguity('L1', axis=axis)
178178
warning_msg = w[0].message.args[0]
179-
if axis == 0:
179+
if axis in {0, 'index'}:
180180
assert warning_msg.startswith("'L1' is both an index level "
181181
"and a column label")
182182
else:
@@ -236,7 +236,7 @@ def test_check_label_or_level_ambiguity_panel_error(panel):
236236
# ===============================
237237
def assert_label_values(frame, labels, axis):
238238
for label in labels:
239-
if axis == 0:
239+
if axis in {0, 'index'}:
240240
expected = frame[label]._values
241241
else:
242242
expected = frame.loc[label]._values
@@ -248,7 +248,7 @@ def assert_label_values(frame, labels, axis):
248248

249249
def assert_level_values(frame, levels, axis):
250250
for level in levels:
251-
if axis == 0:
251+
if axis in {0, 'index'}:
252252
expected = frame.index.get_level_values(level=level)._values
253253
else:
254254
expected = (frame.columns
@@ -267,7 +267,7 @@ def test_get_label_or_level_values_df_simple(df_levels, axis):
267267
expected_labels, expected_levels = get_labels_levels(df_levels)
268268

269269
# Transpose frame if axis == 1
270-
if axis == 1:
270+
if axis in {1, 'columns'}:
271271
df_levels = df_levels.T
272272

273273
# Perform checks
@@ -278,7 +278,7 @@ def test_get_label_or_level_values_df_simple(df_levels, axis):
278278
def test_get_label_or_level_values_df_ambig(df_ambig, axis):
279279

280280
# Transpose frame if axis == 1
281-
if axis == 1:
281+
if axis in {1, 'columns'}:
282282
df_ambig = df_ambig.T
283283

284284
# df has both an on-axis level and off-axis label named L1
@@ -298,7 +298,7 @@ def test_get_label_or_level_values_df_ambig(df_ambig, axis):
298298
def test_get_label_or_level_values_df_duplabels(df_duplabels, axis):
299299

300300
# Transpose frame if axis == 1
301-
if axis == 1:
301+
if axis in {1, 'columns'}:
302302
df_duplabels = df_duplabels.T
303303

304304
# df has unambiguous level 'L1'
@@ -308,7 +308,7 @@ def test_get_label_or_level_values_df_duplabels(df_duplabels, axis):
308308
assert_label_values(df_duplabels, ['L3'], axis=axis)
309309

310310
# df has duplicate labels 'L2'
311-
if axis == 0:
311+
if axis in {0, 'index'}:
312312
expected_msg = "The column label 'L2' is not unique"
313313
else:
314314
expected_msg = "The index label 'L2' is not unique"
@@ -355,7 +355,7 @@ def assert_labels_dropped(frame, labels, axis):
355355
for label in labels:
356356
df_dropped = frame._drop_labels_or_levels(label, axis=axis)
357357

358-
if axis == 0:
358+
if axis in {0, 'index'}:
359359
assert label in frame.columns
360360
assert label not in df_dropped.columns
361361
else:
@@ -367,7 +367,7 @@ def assert_levels_dropped(frame, levels, axis):
367367
for level in levels:
368368
df_dropped = frame._drop_labels_or_levels(level, axis=axis)
369369

370-
if axis == 0:
370+
if axis in {0, 'index'}:
371371
assert level in frame.index.names
372372
assert level not in df_dropped.index.names
373373
else:
@@ -383,7 +383,7 @@ def test_drop_labels_or_levels_df(df_levels, axis):
383383
expected_labels, expected_levels = get_labels_levels(df_levels)
384384

385385
# Transpose frame if axis == 1
386-
if axis == 1:
386+
if axis in {1, 'columns'}:
387387
df_levels = df_levels.T
388388

389389
# Perform checks

0 commit comments

Comments
 (0)