Skip to content

Commit c50ed49

Browse files
committed
BUG: Ensure data_columns is always an Index
1 parent 22d982a commit c50ed49

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

pandas/io/pytables.py

+19-13
Original file line numberDiff line numberDiff line change
@@ -3307,6 +3307,7 @@ def validate_data_columns(self, data_columns, min_itemsize):
33073307
return []
33083308

33093309
axis, axis_labels = self.non_index_axes[0]
3310+
axis_labels = Index(axis_labels)
33103311
info = self.info.get(axis, dict())
33113312
if info.get('type') == 'MultiIndex' and data_columns:
33123313
raise ValueError("cannot use a multi-index on axis [{0}] with "
@@ -3317,19 +3318,21 @@ def validate_data_columns(self, data_columns, min_itemsize):
33173318
if data_columns is True:
33183319
data_columns = axis_labels
33193320
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))
33213325

33223326
# if min_itemsize is a dict, add the keys (exclude 'values')
33233327
if isinstance(min_itemsize, dict):
33243328

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)
33303333

33313334
# 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)
33333336

33343337
def create_axes(self, axes, obj, validate=True, nan_rep=None,
33353338
data_columns=None, min_itemsize=None, **kwargs):
@@ -3450,7 +3453,7 @@ def get_blk_items(mgr, blocks):
34503453
data_columns, min_itemsize)
34513454
if len(data_columns):
34523455
mgr = block_obj.reindex_axis(
3453-
Index(axis_labels).difference(Index(data_columns)),
3456+
Index(axis_labels).difference(data_columns),
34543457
axis=axis
34553458
)._data
34563459

@@ -3490,7 +3493,7 @@ def get_blk_items(mgr, blocks):
34903493
name = None
34913494

34923495
# 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
34943497
b_items[0] in data_columns):
34953498
klass = DataIndexableCol
34963499
name = b_items[0]
@@ -4252,13 +4255,16 @@ def table_type_short(self):
42524255

42534256
def write(self, obj, data_columns=None, **kwargs):
42544257
if data_columns is None:
4255-
data_columns = []
4258+
data_columns = Index([])
42564259
elif data_columns is True:
42574260
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))
42584264
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)
42624268
return super(AppendableMultiFrameTable, self).write(
42634269
obj=obj, data_columns=data_columns, **kwargs)
42644270

0 commit comments

Comments
 (0)