Skip to content

Commit 27b8470

Browse files
committed
BUG: ensure column ordering in HDFStore with dup columns and column where specified
1 parent 57b0184 commit 27b8470

File tree

2 files changed

+30
-9
lines changed

2 files changed

+30
-9
lines changed

pandas/io/pytables.py

+17-8
Original file line numberDiff line numberDiff line change
@@ -2910,9 +2910,7 @@ def create_axes(self, axes, obj, validate=True, nan_rep=None, data_columns=None,
29102910

29112911
# reindex by our non_index_axes & compute data_columns
29122912
for a in self.non_index_axes:
2913-
labels = _ensure_index(a[1])
2914-
if not labels.equals(obj._get_axis(a[0])):
2915-
obj = obj.reindex_axis(labels, axis=a[0])
2913+
obj = _reindex_axis(obj, a[0], a[1])
29162914

29172915
# figure out data_columns and get out blocks
29182916
block_obj = self.get_object(obj).consolidate()
@@ -3000,11 +2998,7 @@ def process_axes(self, obj, columns=None):
30002998

30012999
# reorder by any non_index_axes & limit to the select columns
30023000
for axis, labels in self.non_index_axes:
3003-
if columns is not None:
3004-
labels = Index(labels) & Index(columns)
3005-
labels = _ensure_index(labels)
3006-
if not labels.equals(obj._get_axis(axis)):
3007-
obj = obj.reindex_axis(labels, axis=axis)
3001+
obj = _reindex_axis(obj, axis, labels, columns)
30083002

30093003
# apply the selection filters (but keep in the same order)
30103004
if self.selection.filter:
@@ -3683,6 +3677,21 @@ class AppendableNDimTable(AppendablePanelTable):
36833677
obj_type = Panel4D
36843678

36853679

3680+
def _reindex_axis(obj, axis, labels, other=None):
3681+
ax = obj._get_axis(axis)
3682+
labels = _ensure_index(labels)
3683+
if other is None and labels.equals(ax):
3684+
return obj
3685+
3686+
labels = _ensure_index(labels.unique())
3687+
if other is not None:
3688+
labels = labels & _ensure_index(other)
3689+
if not labels.equals(ax):
3690+
slicer = [ slice(None, None) ] * obj.ndim
3691+
slicer[axis] = labels
3692+
obj = obj.loc[tuple(slicer)]
3693+
return obj
3694+
36863695
def _get_info(info, name):
36873696
""" get/create the info for this name """
36883697
try:

pandas/io/tests/test_pytables.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -2298,7 +2298,6 @@ def test_wide_table(self):
22982298

22992299
def test_select_with_dups(self):
23002300

2301-
23022301
# single dtypes
23032302
df = DataFrame(np.random.randn(10,4),columns=['A','A','B','B'])
23042303
df.index = date_range('20130101 9:30',periods=10,freq='T')
@@ -2308,6 +2307,10 @@ def test_select_with_dups(self):
23082307
result = store.select('df')
23092308
assert_frame_equal(result,df)
23102309

2310+
result = store.select('df',columns=['A'])
2311+
expected = df.loc[:,['A']]
2312+
assert_frame_equal(result,expected)
2313+
23112314
# dups accross dtypes
23122315
df = concat([DataFrame(np.random.randn(10,4),columns=['A','A','B','B']),
23132316
DataFrame(np.random.randint(0,10,size=20).reshape(10,2),columns=['A','C'])],
@@ -2316,9 +2319,18 @@ def test_select_with_dups(self):
23162319

23172320
with ensure_clean(self.path) as store:
23182321
store.append('df',df)
2322+
23192323
result = store.select('df')
23202324
assert_frame_equal(result,df)
23212325

2326+
expected = df.loc[:,['A']]
2327+
result = store.select('df',columns=['A'])
2328+
assert_frame_equal(result,expected)
2329+
2330+
expected = df.loc[:,['B','A']]
2331+
result = store.select('df',columns=['B','A'])
2332+
assert_frame_equal(result,expected)
2333+
23222334
def test_wide_table_dups(self):
23232335
wp = tm.makePanel()
23242336
with ensure_clean(self.path) as store:

0 commit comments

Comments
 (0)