|
9 | 9 |
|
10 | 10 | from pandas.core.dtypes.common import (
|
11 | 11 | is_float,
|
| 12 | + is_hashable, |
12 | 13 | is_integer,
|
13 | 14 | is_iterator,
|
14 | 15 | is_list_like,
|
@@ -581,6 +582,9 @@ def _get_setitem_indexer(self, key):
|
581 | 582 | """
|
582 | 583 | Convert a potentially-label-based key into a positional indexer.
|
583 | 584 | """
|
| 585 | + if self.name == "loc": |
| 586 | + self._ensure_listlike_indexer(key) |
| 587 | + |
584 | 588 | if self.axis is not None:
|
585 | 589 | return self._convert_tuple(key, is_setter=True)
|
586 | 590 |
|
@@ -611,6 +615,39 @@ def _get_setitem_indexer(self, key):
|
611 | 615 | raise
|
612 | 616 | raise IndexingError(key)
|
613 | 617 |
|
| 618 | + def _ensure_listlike_indexer(self, key): |
| 619 | + """ |
| 620 | + Ensure that a list-like of column labels are all present by adding them if |
| 621 | + they do not already exist. |
| 622 | +
|
| 623 | + Parameters |
| 624 | + ---------- |
| 625 | + key : _LocIndexer key or list-like of column labels |
| 626 | + Target labels. |
| 627 | + """ |
| 628 | + column_axis = 1 |
| 629 | + |
| 630 | + # column only exists in 2-dimensional DataFrame |
| 631 | + if self.ndim != 2: |
| 632 | + return |
| 633 | + |
| 634 | + if isinstance(key, tuple): |
| 635 | + # key may be a tuple if key is a _LocIndexer key |
| 636 | + # in that case, set key to the column part of key |
| 637 | + key = key[column_axis] |
| 638 | + |
| 639 | + if ( |
| 640 | + not isinstance(self.obj._get_axis(column_axis), ABCMultiIndex) |
| 641 | + and is_list_like_indexer(key) |
| 642 | + and not com.is_bool_indexer(key) |
| 643 | + and all(is_hashable(k) for k in key) |
| 644 | + ): |
| 645 | + for k in key: |
| 646 | + try: |
| 647 | + self.obj[k] |
| 648 | + except KeyError: |
| 649 | + self.obj[k] = np.nan |
| 650 | + |
614 | 651 | def __setitem__(self, key, value):
|
615 | 652 | if isinstance(key, tuple):
|
616 | 653 | key = tuple(com.apply_if_callable(x, self.obj) for x in key)
|
|
0 commit comments