@@ -318,14 +318,14 @@ def _setitem_with_indexer(self, indexer, value):
318
318
# maybe partial set
319
319
take_split_path = self .obj ._is_mixed_type
320
320
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
329
329
330
330
# if there is only one block/type, still have to take split path
331
331
# unless the block is one-dimensional or it can hold the value
@@ -415,21 +415,14 @@ def _setitem_with_indexer(self, indexer, value):
415
415
if isinstance (value , ABCSeries ):
416
416
value = self ._align_series (indexer , value )
417
417
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 ]
427
422
428
423
# if we have a partial multiindex, then need to adjust the plane
429
424
# 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 ):
433
426
item = labels [0 ]
434
427
obj = self .obj [item ]
435
428
index = obj .index
@@ -472,9 +465,7 @@ def _setitem_with_indexer(self, indexer, value):
472
465
lplane_indexer = length_of_indexer (plane_indexer [0 ], plane_axis )
473
466
474
467
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 ]
478
469
pi = plane_indexer [0 ] if lplane_indexer == 1 else plane_indexer
479
470
480
471
# perform the equivalent of a setitem on the info axis
@@ -486,14 +477,8 @@ def setter(item, v):
486
477
com .is_null_slice (idx ) or com .is_full_slice (idx , len (self .obj ))
487
478
for idx in pi
488
479
):
489
- if missing :
490
- self .obj [item ] = v
491
- return
492
480
s = v
493
481
else :
494
- if missing :
495
- self [plane_indexer [0 ], item ] = v
496
- return
497
482
# set the item, possibly having a dtype change
498
483
s ._consolidate_inplace ()
499
484
s = s .copy ()
@@ -1291,10 +1276,8 @@ def _convert_to_indexer(
1291
1276
return inds
1292
1277
else :
1293
1278
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 }
1298
1281
return self ._get_listlike_indexer (obj , axis , ** kwargs )[1 ]
1299
1282
except KeyError :
1300
1283
# allow missing columns when setting
0 commit comments