From be81d091000c2ad47048d5c6d8bc1463802d5f18 Mon Sep 17 00:00:00 2001 From: Pietro Battiston Date: Sun, 7 Feb 2016 11:25:37 +0100 Subject: [PATCH] BUG: Ensure data_columns is always a list (i.e. min_itemsize can extend it) closes #10381 --- pandas/io/pytables.py | 6 +++--- pandas/io/tests/test_pytables.py | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index cd8f7699a85d1..5d727be9b8fc8 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -3247,7 +3247,7 @@ def validate_data_columns(self, data_columns, min_itemsize): # evaluate the passed data_columns, True == use all columns # take only valide axis labels if data_columns is True: - data_columns = axis_labels + data_columns = list(axis_labels) elif data_columns is None: data_columns = [] @@ -4084,7 +4084,7 @@ def write(self, obj, data_columns=None, **kwargs): obj = DataFrame({name: obj}, index=obj.index) obj.columns = [name] return super(AppendableSeriesTable, self).write( - obj=obj, data_columns=obj.columns, **kwargs) + obj=obj, data_columns=list(obj.columns), **kwargs) def read(self, columns=None, **kwargs): @@ -4185,7 +4185,7 @@ def write(self, obj, data_columns=None, **kwargs): if data_columns is None: data_columns = [] elif data_columns is True: - data_columns = obj.columns[:] + data_columns = list(obj.columns[:]) obj, self.levels = self.validate_multiindex(obj) for n in self.levels: if n not in data_columns: diff --git a/pandas/io/tests/test_pytables.py b/pandas/io/tests/test_pytables.py index b08d24747bcd3..5225cfdf837a3 100644 --- a/pandas/io/tests/test_pytables.py +++ b/pandas/io/tests/test_pytables.py @@ -1338,6 +1338,16 @@ def check_col(key, name, size): [[124, 'abcdefqhij'], [346, 'abcdefghijklmnopqrtsuvwxyz']]) self.assertRaises(ValueError, store.append, 'df_new', df_new) + # min_itemsize on Series with Multiindex (GH 10381) + df = tm.makeMixedDataFrame().set_index(['A', 'C']) + store.append('ss', df['B'], min_itemsize={'index': 4}) + tm.assert_series_equal(store.select('ss'), df['B']) + + # min_itemsize with MultiIndex and data_columns=True + store.append('midf', df, data_columns=True, + min_itemsize={'index': 4}) + tm.assert_frame_equal(store.select('midf'), df) + # with nans _maybe_remove(store, 'df') df = tm.makeTimeDataFrame()