Skip to content

Commit 335d100

Browse files
phoflsimonjayhawkins
authored andcommitted
Backport PR pandas-dev#38148: ENH: Improve performance for df.__setitem__ with list-like indexers
1 parent 45c1016 commit 335d100

File tree

3 files changed

+11
-3
lines changed

3 files changed

+11
-3
lines changed

asv_bench/benchmarks/indexing.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,14 @@ def time_assign_with_setitem(self):
358358
for i in range(100):
359359
self.df[i] = np.random.randn(self.N)
360360

361+
def time_assign_list_like_with_setitem(self):
362+
np.random.seed(1234)
363+
self.df[list(range(100))] = np.random.randn(self.N, 100)
364+
365+
def time_assign_list_of_columns_concat(self):
366+
df = DataFrame(np.random.randn(self.N, 100))
367+
concat([self.df, df], axis=1)
368+
361369

362370
class ChainIndexing:
363371

doc/source/whatsnew/v1.1.5.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ Fixed regressions
2323
- Fixed regression in :meth:`DataFrame.groupby` aggregation with out-of-bounds datetime objects in an object-dtype column (:issue:`36003`)
2424
- Fixed regression in ``df.groupby(..).rolling(..)`` with the resulting :class:`MultiIndex` when grouping by a label that is in the index (:issue:`37641`)
2525
- Fixed regression in :meth:`DataFrame.fillna` not filling ``NaN`` after other operations such as :meth:`DataFrame.pivot` (:issue:`36495`).
26+
- Fixed performance regression for :meth:`DataFrame.__setitem__` with list-like indexers (:issue:`37954`)
2627

2728
.. ---------------------------------------------------------------------------
2829

pandas/core/indexing.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -654,9 +654,8 @@ def _ensure_listlike_indexer(self, key, axis=None):
654654
and not com.is_bool_indexer(key)
655655
and all(is_hashable(k) for k in key)
656656
):
657-
for k in key:
658-
if k not in self.obj:
659-
self.obj[k] = np.nan
657+
keys = self.obj.columns.union(key, sort=False)
658+
self.obj._mgr = self.obj._mgr.reindex_axis(keys, 0)
660659

661660
def __setitem__(self, key, value):
662661
if isinstance(key, tuple):

0 commit comments

Comments
 (0)