Skip to content

Commit 96d674c

Browse files
committed
Merge pull request #2855 from jreback/pytables_bug
BUG: proper conversion of string to bool HDFStore selection
2 parents dad367e + 6ca4405 commit 96d674c

File tree

2 files changed

+22
-9
lines changed

2 files changed

+22
-9
lines changed

pandas/io/pytables.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,14 @@ def __repr__(self):
250250
values = []
251251

252252
for k in self.keys():
253-
s = self.get_storer(k)
254-
if s is not None:
255-
keys.append(str(s.pathname or k))
256-
values.append(str(s or 'invalid_HDFStore node'))
253+
try:
254+
s = self.get_storer(k)
255+
if s is not None:
256+
keys.append(str(s.pathname or k))
257+
values.append(str(s or 'invalid_HDFStore node'))
258+
except (Exception), detail:
259+
keys.append(k)
260+
values.append("[invalid_HDFStore node: %s]" % str(detail))
257261

258262
output += adjoin(12, keys, values)
259263
else:
@@ -3060,7 +3064,10 @@ def convert_value(self, v):
30603064
v = float(v)
30613065
return [v, v]
30623066
elif self.kind == 'bool':
3063-
v = bool(v)
3067+
if isinstance(v, basestring):
3068+
v = not str(v).strip().lower() in ["false", "f", "no", "n", "none", "0", "[]", "{}", ""]
3069+
else:
3070+
v = bool(v)
30643071
return [v, v]
30653072
elif not isinstance(v, basestring):
30663073
return [str(v), None]

pandas/io/tests/test_pytables.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1649,15 +1649,20 @@ def test_select_dtypes(self):
16491649
df['bool'] = df['A'] > 0
16501650
store.remove('df')
16511651
store.append('df', df, data_columns = True)
1652-
result = store.select('df', Term('bool == True'), columns = ['A','bool'])
1652+
16531653
expected = df[df.bool == True].reindex(columns=['A','bool'])
1654-
tm.assert_frame_equal(expected, result)
1654+
for v in [True,'true',1]:
1655+
result = store.select('df', Term('bool == %s' % str(v)), columns = ['A','bool'])
1656+
tm.assert_frame_equal(expected, result)
16551657

1656-
result = store.select('df', Term('bool == 1'), columns = ['A','bool'])
1657-
tm.assert_frame_equal(expected, result)
1658+
expected = df[df.bool == False ].reindex(columns=['A','bool'])
1659+
for v in [False,'false',0]:
1660+
result = store.select('df', Term('bool == %s' % str(v)), columns = ['A','bool'])
1661+
tm.assert_frame_equal(expected, result)
16581662

16591663
# integer index
16601664
df = DataFrame(dict(A=np.random.rand(20), B=np.random.rand(20)))
1665+
store.remove('df_int')
16611666
store.append('df_int', df)
16621667
result = store.select(
16631668
'df_int', [Term("index<10"), Term("columns", "=", ["A"])])
@@ -1667,6 +1672,7 @@ def test_select_dtypes(self):
16671672
# float index
16681673
df = DataFrame(dict(A=np.random.rand(
16691674
20), B=np.random.rand(20), index=np.arange(20, dtype='f8')))
1675+
store.remove('df_float')
16701676
store.append('df_float', df)
16711677
result = store.select(
16721678
'df_float', [Term("index<10.0"), Term("columns", "=", ["A"])])

0 commit comments

Comments
 (0)