@@ -3307,6 +3307,7 @@ def validate_data_columns(self, data_columns, min_itemsize):
3307
3307
return []
3308
3308
3309
3309
axis , axis_labels = self .non_index_axes [0 ]
3310
+ axis_labels = Index (axis_labels )
3310
3311
info = self .info .get (axis , dict ())
3311
3312
if info .get ('type' ) == 'MultiIndex' and data_columns :
3312
3313
raise ValueError ("cannot use a multi-index on axis [{0}] with "
@@ -3317,19 +3318,21 @@ def validate_data_columns(self, data_columns, min_itemsize):
3317
3318
if data_columns is True :
3318
3319
data_columns = axis_labels
3319
3320
elif data_columns is None :
3320
- data_columns = []
3321
+ data_columns = Index ([])
3322
+ elif not isinstance (data_columns , Index ):
3323
+ # Support e.g. FrozenLists data_columns
3324
+ data_columns = Index (iter (data_columns ))
3321
3325
3322
3326
# if min_itemsize is a dict, add the keys (exclude 'values')
3323
3327
if isinstance (min_itemsize , dict ):
3324
3328
3325
- existing_data_columns = set (data_columns )
3326
- data_columns .extend ([
3327
- k for k in min_itemsize .keys ()
3328
- if k != 'values' and k not in existing_data_columns
3329
- ])
3329
+ missing_data_columns = Index (
3330
+ [k for k in min_itemsize .keys ()
3331
+ if k != 'values' ]).difference (data_columns )
3332
+ data_columns = data_columns .append (missing_data_columns )
3330
3333
3331
3334
# return valid columns in the order of our axis
3332
- return [ c for c in data_columns if c in axis_labels ]
3335
+ return axis_labels . intersection ( data_columns )
3333
3336
3334
3337
def create_axes (self , axes , obj , validate = True , nan_rep = None ,
3335
3338
data_columns = None , min_itemsize = None , ** kwargs ):
@@ -3450,7 +3453,7 @@ def get_blk_items(mgr, blocks):
3450
3453
data_columns , min_itemsize )
3451
3454
if len (data_columns ):
3452
3455
mgr = block_obj .reindex_axis (
3453
- Index (axis_labels ).difference (Index ( data_columns ) ),
3456
+ Index (axis_labels ).difference (data_columns ),
3454
3457
axis = axis
3455
3458
)._data
3456
3459
@@ -3490,7 +3493,7 @@ def get_blk_items(mgr, blocks):
3490
3493
name = None
3491
3494
3492
3495
# we have a data_column
3493
- if (data_columns and len (b_items ) == 1 and
3496
+ if (len ( data_columns ) and len (b_items ) == 1 and
3494
3497
b_items [0 ] in data_columns ):
3495
3498
klass = DataIndexableCol
3496
3499
name = b_items [0 ]
@@ -4252,13 +4255,16 @@ def table_type_short(self):
4252
4255
4253
4256
def write (self , obj , data_columns = None , ** kwargs ):
4254
4257
if data_columns is None :
4255
- data_columns = []
4258
+ data_columns = Index ([])
4256
4259
elif data_columns is True :
4257
4260
data_columns = obj .columns [:]
4261
+ elif not isinstance (data_columns , Index ):
4262
+ # Support e.g. FrozenLists data_columns
4263
+ data_columns = Index (iter (data_columns ))
4258
4264
obj , self .levels = self .validate_multiindex (obj )
4259
- for n in self . levels :
4260
- if n not in data_columns :
4261
- data_columns . insert ( 0 , n )
4265
+ # Place elements of lev not in data_columns first, then data_columns
4266
+ miss_data_columns = Index ( self . levels ). difference ( data_columns )
4267
+ data_columns = miss_data_columns . union ( data_columns )
4262
4268
return super (AppendableMultiFrameTable , self ).write (
4263
4269
obj = obj , data_columns = data_columns , ** kwargs )
4264
4270
0 commit comments