diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 516b6c211fc7f..84c2ef4957529 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -250,10 +250,14 @@ def __repr__(self): values = [] for k in self.keys(): - s = self.get_storer(k) - if s is not None: - keys.append(str(s.pathname or k)) - values.append(str(s or 'invalid_HDFStore node')) + try: + s = self.get_storer(k) + if s is not None: + keys.append(str(s.pathname or k)) + values.append(str(s or 'invalid_HDFStore node')) + except (Exception), detail: + keys.append(k) + values.append("[invalid_HDFStore node: %s]" % str(detail)) output += adjoin(12, keys, values) else: @@ -3060,7 +3064,10 @@ def convert_value(self, v): v = float(v) return [v, v] elif self.kind == 'bool': - v = bool(v) + if isinstance(v, basestring): + v = not str(v).strip().lower() in ["false", "f", "no", "n", "none", "0", "[]", "{}", ""] + else: + v = bool(v) return [v, v] elif not isinstance(v, basestring): return [str(v), None] diff --git a/pandas/io/tests/test_pytables.py b/pandas/io/tests/test_pytables.py index 8260180138752..8b77cee3730fc 100644 --- a/pandas/io/tests/test_pytables.py +++ b/pandas/io/tests/test_pytables.py @@ -1649,15 +1649,20 @@ def test_select_dtypes(self): df['bool'] = df['A'] > 0 store.remove('df') store.append('df', df, data_columns = True) - result = store.select('df', Term('bool == True'), columns = ['A','bool']) + expected = df[df.bool == True].reindex(columns=['A','bool']) - tm.assert_frame_equal(expected, result) + for v in [True,'true',1]: + result = store.select('df', Term('bool == %s' % str(v)), columns = ['A','bool']) + tm.assert_frame_equal(expected, result) - result = store.select('df', Term('bool == 1'), columns = ['A','bool']) - tm.assert_frame_equal(expected, result) + expected = df[df.bool == False ].reindex(columns=['A','bool']) + for v in [False,'false',0]: + result = store.select('df', Term('bool == %s' % str(v)), columns = ['A','bool']) + tm.assert_frame_equal(expected, result) # integer index df = DataFrame(dict(A=np.random.rand(20), B=np.random.rand(20))) + store.remove('df_int') store.append('df_int', df) result = store.select( 'df_int', [Term("index<10"), Term("columns", "=", ["A"])]) @@ -1667,6 +1672,7 @@ def test_select_dtypes(self): # float index df = DataFrame(dict(A=np.random.rand( 20), B=np.random.rand(20), index=np.arange(20, dtype='f8'))) + store.remove('df_float') store.append('df_float', df) result = store.select( 'df_float', [Term("index<10.0"), Term("columns", "=", ["A"])])