Skip to content

Commit 6006f2c

Browse files
author
How Si Wei
committed
Insert nan column first when columns are missing
1 parent 3054b6d commit 6006f2c

File tree

2 files changed

+17
-35
lines changed

2 files changed

+17
-35
lines changed

pandas/core/frame.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -3484,8 +3484,7 @@ def _setitem_array(self, key, value):
34843484
for k1, k2 in zip(key, value.columns):
34853485
self[k1] = value[k2]
34863486
else:
3487-
indexer = self.loc._convert_to_indexer(key, axis=1,
3488-
is_setter=True)
3487+
indexer = self.loc._convert_to_indexer(key, axis=1, is_setter=True)
34893488
self._check_setitem_copy()
34903489
self.loc._setitem_with_indexer((slice(None), indexer), value)
34913490

pandas/core/indexing.py

+16-33
Original file line numberDiff line numberDiff line change
@@ -318,14 +318,14 @@ def _setitem_with_indexer(self, indexer, value):
318318
# maybe partial set
319319
take_split_path = self.obj._is_mixed_type
320320

321-
has_missing_columns = (
322-
isinstance(indexer, tuple) and
323-
len(indexer) > info_axis and
324-
is_list_like_indexer(indexer[info_axis]) and
325-
any(isinstance(k, dict) for k in indexer[info_axis]))
326-
327-
if has_missing_columns:
328-
take_split_path = True
321+
if (isinstance(indexer, tuple) and len(indexer) > 1 and
322+
is_list_like_indexer(indexer[1])):
323+
for i, k in enumerate(indexer[1]):
324+
if isinstance(k, dict):
325+
key = k['key']
326+
self.obj[key] = np.nan
327+
indexer[1][i] = self._convert_to_indexer(key, axis=1)
328+
take_split_path = True
329329

330330
# if there is only one block/type, still have to take split path
331331
# unless the block is one-dimensional or it can hold the value
@@ -415,21 +415,14 @@ def _setitem_with_indexer(self, indexer, value):
415415
if isinstance(value, ABCSeries):
416416
value = self._align_series(indexer, value)
417417

418-
if has_missing_columns:
419-
labels = [idx['key'] if isinstance(idx, dict) else
420-
item_labels[idx]
421-
for idx in indexer[info_axis]]
422-
else:
423-
info_idx = indexer[info_axis]
424-
if is_integer(info_idx):
425-
info_idx = [info_idx]
426-
labels = item_labels[info_idx]
418+
info_idx = indexer[info_axis]
419+
if is_integer(info_idx):
420+
info_idx = [info_idx]
421+
labels = item_labels[info_idx]
427422

428423
# if we have a partial multiindex, then need to adjust the plane
429424
# indexer here
430-
if (len(labels) == 1 and
431-
labels[0] in self.obj.columns and
432-
isinstance(self.obj[labels[0]].axes[0], MultiIndex)):
425+
if len(labels) == 1 and isinstance(self.obj[labels[0]].axes[0], MultiIndex):
433426
item = labels[0]
434427
obj = self.obj[item]
435428
index = obj.index
@@ -472,9 +465,7 @@ def _setitem_with_indexer(self, indexer, value):
472465
lplane_indexer = length_of_indexer(plane_indexer[0], plane_axis)
473466

474467
def setter(item, v):
475-
missing = item not in self.obj.columns
476-
if not missing:
477-
s = self.obj[item]
468+
s = self.obj[item]
478469
pi = plane_indexer[0] if lplane_indexer == 1 else plane_indexer
479470

480471
# perform the equivalent of a setitem on the info axis
@@ -486,14 +477,8 @@ def setter(item, v):
486477
com.is_null_slice(idx) or com.is_full_slice(idx, len(self.obj))
487478
for idx in pi
488479
):
489-
if missing:
490-
self.obj[item] = v
491-
return
492480
s = v
493481
else:
494-
if missing:
495-
self[plane_indexer[0], item] = v
496-
return
497482
# set the item, possibly having a dtype change
498483
s._consolidate_inplace()
499484
s = s.copy()
@@ -1291,10 +1276,8 @@ def _convert_to_indexer(
12911276
return inds
12921277
else:
12931278
try:
1294-
# When setting, missing keys are not allowed, even with
1295-
# .loc:
1296-
kwargs = {'raise_missing': True if is_setter else
1297-
raise_missing}
1279+
# When setting, missing keys are not allowed, even with # .loc:
1280+
kwargs = {"raise_missing": True if is_setter else raise_missing}
12981281
return self._get_listlike_indexer(obj, axis, **kwargs)[1]
12991282
except KeyError:
13001283
# allow missing columns when setting

0 commit comments

Comments
 (0)