Skip to content

Commit 0794d11

Browse files
committed
ENH: concat Series with axis=1 for completeness, GH #787
1 parent e873a2e commit 0794d11

File tree

3 files changed

+52
-9
lines changed

3 files changed

+52
-9
lines changed

pandas/tools/merge.py

+27-8
Original file line numberDiff line numberDiff line change
@@ -749,10 +749,14 @@ def __init__(self, objs, axis=0, join='outer', join_axes=None,
749749
self.new_axes = self._get_new_axes()
750750

751751
def get_result(self):
752-
if self._is_series:
752+
if self._is_series and self.axis == 0:
753753
new_data = np.concatenate([x.values for x in self.objs])
754754
name = _consensus_name_attr(self.objs)
755755
return Series(new_data, index=self.new_axes[0], name=name)
756+
elif self._is_series:
757+
data = dict(zip(self.new_axes[1], self.objs))
758+
return DataFrame(data, index=self.new_axes[0],
759+
columns=self.new_axes[1])
756760
else:
757761
new_data = self._get_concatenated_data()
758762
return self.objs[0]._from_axes(new_data, self.new_axes)
@@ -864,8 +868,14 @@ def _concat_single_item(self, item):
864868
assert(self.axis >= 1)
865869
return np.concatenate(to_concat, axis=self.axis - 1)
866870

871+
def _get_result_dim(self):
872+
if self._is_series and self.axis == 1:
873+
return 2
874+
else:
875+
return self.objs[0].ndim
876+
867877
def _get_new_axes(self):
868-
ndim = self.objs[0].ndim
878+
ndim = self._get_result_dim()
869879
new_axes = [None] * ndim
870880

871881
if self.ignore_index:
@@ -879,11 +889,7 @@ def _get_new_axes(self):
879889
for i in range(ndim):
880890
if i == self.axis:
881891
continue
882-
all_indexes = [x._data.axes[i] for x in self.objs]
883-
comb_axis = _get_combined_index(all_indexes,
884-
intersect=self.intersect)
885-
new_axes[i] = comb_axis
886-
892+
new_axes[i] = self._get_comb_axis(i)
887893
else:
888894
assert(len(self.join_axes) == ndim - 1)
889895

@@ -896,9 +902,22 @@ def _get_new_axes(self):
896902

897903
return new_axes
898904

905+
def _get_comb_axis(self, i):
906+
if self._is_series:
907+
all_indexes = [x.index for x in self.objs]
908+
else:
909+
all_indexes = [x._data.axes[i] for x in self.objs]
910+
911+
return _get_combined_index(all_indexes, intersect=self.intersect)
912+
899913
def _get_concat_axis(self):
900914
if self._is_series:
901-
indexes = [x.index for x in self.objs]
915+
if self.axis == 0:
916+
indexes = [x.index for x in self.objs]
917+
elif self.keys is None:
918+
return Index(np.arange(len(self.objs)))
919+
else:
920+
return _ensure_index(self.keys)
902921
else:
903922
indexes = [x._data.axes[self.axis] for x in self.objs]
904923

pandas/tools/tests/test_merge.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -1174,7 +1174,18 @@ def test_concat_series(self):
11741174
expected.index = exp_index
11751175
tm.assert_series_equal(result, expected)
11761176

1177-
self.assertRaises(Exception, concat, pieces, axis=1)
1177+
def test_concat_series_axis1(self):
1178+
ts = tm.makeTimeSeries()
1179+
1180+
pieces = [ts[:-2], ts[2:], ts[2:-2]]
1181+
1182+
result = concat(pieces, axis=1)
1183+
expected = DataFrame(pieces).T
1184+
assert_frame_equal(result, expected)
1185+
1186+
result = concat(pieces, keys=['A', 'B', 'C'], axis=1)
1187+
expected = DataFrame(pieces, index=['A', 'B', 'C']).T
1188+
assert_frame_equal(result, expected)
11781189

11791190
def test_concat_single_with_key(self):
11801191
df = DataFrame(np.random.randn(10, 4))

vb_suite/join_merge.py

+13
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,16 @@ def sample(values, k):
131131
name="series_align_left_monotonic",
132132
start_date=datetime(2011, 3, 1), logy=True)
133133

134+
#----------------------------------------------------------------------
135+
# Concat Series axis=1
136+
137+
setup = common_setup + """
138+
n = 1000
139+
indices = Index([rands(10) for _ in xrange(1000)])
140+
s = Series(n, index=indices)
141+
pieces = [s[i:-i] for i in range(1, 10)]
142+
pieces = pieces * 50
143+
"""
144+
145+
concat_series_axis1 = Benchmark('concat(pieces, axis=1)', setup,
146+
start_date=datetime(2012, 2, 27))

0 commit comments

Comments
 (0)