Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions doc/source/whatsnew/v0.21.0.txt
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,7 @@ Indexing
- Fixes ``DataFrame.loc`` for setting with alignment and tz-aware ``DatetimeIndex`` (:issue:`16889`)
- Avoids ``IndexError`` when passing an Index or Series to ``.iloc`` with older numpy (:issue:`17193`)
- Allow unicode empty strings as placeholders in multilevel columns in Python 2 (:issue:`17099`)
- Bug in ``.iloc`` when used with inplace addition or assignment and an int indexer on a ``MultiIndex`` causing the wrong indexes to be read from and written to (:issue:`17148`)

I/O
^^^
Expand Down
3 changes: 2 additions & 1 deletion pandas/core/indexing.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,8 @@ def _get_setitem_indexer(self, key):
return self._convert_tuple(key, is_setter=True)

axis = self.obj._get_axis(0)
if isinstance(axis, MultiIndex):

if isinstance(axis, MultiIndex) and self.name != 'iloc':
try:
return axis.get_loc(key)
except Exception:
Expand Down
24 changes: 24 additions & 0 deletions pandas/tests/indexing/test_iloc.py
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,30 @@ def test_iloc_setitem(self):
expected = Series([0, 1, 0], index=[4, 5, 6])
tm.assert_series_equal(s, expected)

@pytest.mark.parametrize(
"data, indexes, values, expected_k", [
([[1, 22, 5], [1, 33, 6]], [0, -1, 1], [2, 3, 1], [7, 10]),
([[2, 22, 5], [2, 33, 6]], [0, -1, 1], [2, 3, 1], [7, 10]),
([[1, 3, 7], [2, 4, 8]], [0, -1, 1], [1, 1, 10], [8, 19]),
([[1, 11, 4], [2, 22, 5], [3, 33, 6]], [0, -1, 1], [4, 7, 10],
[8, 15, 13])
])
def test_iloc_setitem_int_multiindex_series(
self, data, indexes, values, expected_k):
# GH17148
df = pd.DataFrame(
data=data,
columns=['i', 'j', 'k'])
df.set_index(['i', 'j'], inplace=True)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

df = df.set_index(...), don't use inplace in testing code.


series = df.k.copy()
for i, v in zip(indexes, values):
series.iloc[i] += v

df.k = expected_k
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

df['k'] = expected_k

expected = df.k.copy()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this copy is necessary?

tm.assert_series_equal(series, expected)

def test_iloc_setitem_list(self):

# setitem with an iloc list
Expand Down