Skip to content

Commit 1050adb

Browse files
Merge pull request #9475 from jorisvandenbossche/bug-mul-level
BUG: binary operator method alignment with integer level (GH9463)
2 parents e1aaf8c + d0ca15b commit 1050adb

File tree

3 files changed

+36
-12
lines changed

3 files changed

+36
-12
lines changed

doc/source/whatsnew/v0.16.0.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ Bug Fixes
267267

268268

269269

270-
270+
- Bug in binary operator method (eg ``.mul()``) alignment with integer levels (:issue:`9463`).
271271

272272

273273

pandas/core/generic.py

+6-11
Original file line numberDiff line numberDiff line change
@@ -3172,30 +3172,25 @@ def _align_series(self, other, join='outer', axis=None, level=None,
31723172

31733173
else:
31743174

3175-
# for join compat if we have an unnamed index, but
3176-
# are specifying a level join
3177-
other_index = other.index
3178-
if level is not None and other.index.name is None:
3179-
other_index = other_index.set_names([level])
3180-
31813175
# one has > 1 ndim
31823176
fdata = self._data
31833177
if axis == 0:
31843178
join_index = self.index
31853179
lidx, ridx = None, None
3186-
if not self.index.equals(other_index):
3187-
join_index, lidx, ridx = self.index.join(
3188-
other_index, how=join, return_indexers=True)
3180+
if not self.index.equals(other.index):
3181+
join_index, lidx, ridx = \
3182+
self.index.join(other.index, how=join, level=level,
3183+
return_indexers=True)
31893184

31903185
if lidx is not None:
31913186
fdata = fdata.reindex_indexer(join_index, lidx, axis=1)
31923187

31933188
elif axis == 1:
31943189
join_index = self.columns
31953190
lidx, ridx = None, None
3196-
if not self.columns.equals(other_index):
3191+
if not self.columns.equals(other.index):
31973192
join_index, lidx, ridx = \
3198-
self.columns.join(other_index, how=join,
3193+
self.columns.join(other.index, how=join, level=level,
31993194
return_indexers=True)
32003195

32013196
if lidx is not None:

pandas/tests/test_frame.py

+29
Original file line numberDiff line numberDiff line change
@@ -5431,6 +5431,35 @@ def test_binary_ops_align(self):
54315431
expected = pd.concat([ opa(df.loc[idx[:,i],:],v) for i, v in x.iteritems() ]).reindex_like(df).sortlevel()
54325432
assert_frame_equal(result, expected)
54335433

5434+
## GH9463 (alignment level of dataframe with series)
5435+
5436+
midx = MultiIndex.from_product([['A', 'B'],['a', 'b']])
5437+
df = DataFrame(np.ones((2,4), dtype='int64'), columns=midx)
5438+
s = pd.Series({'a':1, 'b':2})
5439+
5440+
df2 = df.copy()
5441+
df2.columns.names = ['lvl0', 'lvl1']
5442+
s2 = s.copy()
5443+
s2.index.name = 'lvl1'
5444+
5445+
# different cases of integer/string level names:
5446+
res1 = df.mul(s, axis=1, level=1)
5447+
res2 = df.mul(s2, axis=1, level=1)
5448+
res3 = df2.mul(s, axis=1, level=1)
5449+
res4 = df2.mul(s2, axis=1, level=1)
5450+
res5 = df2.mul(s, axis=1, level='lvl1')
5451+
res6 = df2.mul(s2, axis=1, level='lvl1')
5452+
5453+
exp = DataFrame(np.array([[1, 2, 1, 2], [1, 2, 1, 2]], dtype='int64'),
5454+
columns=midx)
5455+
5456+
for res in [res1, res2]:
5457+
assert_frame_equal(res, exp)
5458+
5459+
exp.columns.names = ['lvl0', 'lvl1']
5460+
for res in [res3, res4, res5, res6]:
5461+
assert_frame_equal(res, exp)
5462+
54345463
def test_arith_mixed(self):
54355464

54365465
left = DataFrame({'A': ['a', 'b', 'c'],

0 commit comments

Comments
 (0)