diff --git a/doc/source/release.rst b/doc/source/release.rst index e38d5e00a31ad..7824a69c92561 100644 --- a/doc/source/release.rst +++ b/doc/source/release.rst @@ -396,7 +396,7 @@ Bug Fixes - Bug in ``DataFrame.to_csv`` where setting `index` to `False` ignored the `header` kwarg (:issue:`6186`) - Bug in `DataFrame.plot` and `Series.plot` legend behave inconsistently when plotting to the same axes repeatedly (:issue:`6678`) -- Internal tests for patching ``__finalize__`` / bug in merge not finalizing (:issue:`6923`) +- Internal tests for patching ``__finalize__`` / bug in merge not finalizing (:issue:`6923`, :issue:`6927`) pandas 0.13.1 ------------- diff --git a/pandas/tests/test_generic.py b/pandas/tests/test_generic.py index 9556f5d9f9a62..91bca01ab73b5 100644 --- a/pandas/tests/test_generic.py +++ b/pandas/tests/test_generic.py @@ -440,6 +440,32 @@ def test_metadata_propagation_indiv(self): result = ts.resample('1T',how=lambda x: x.sum()) self.check_metadata(ts,result) + _metadata = Series._metadata + _finalize = Series.__finalize__ + Series._metadata = ['name','filename'] + o.filename = 'foo' + o2.filename = 'bar' + + def finalize(self, other, method=None, **kwargs): + for name in self._metadata: + if method == 'concat' and name == 'filename': + value = '+'.join([ getattr(o,name) for o in other.objs if getattr(o,name,None) ]) + object.__setattr__(self, name, value) + else: + object.__setattr__(self, name, getattr(other, name, None)) + + return self + + Series.__finalize__ = finalize + + result = pd.concat([o, o2]) + self.assertEquals(result.filename,'foo+bar') + self.assertIsNone(result.name) + + # reset + Series._metadata = _metadata + Series.__finalize__ = _finalize + def test_interpolate(self): ts = Series(np.arange(len(self.ts), dtype=float), self.ts.index) @@ -894,6 +920,28 @@ def finalize(self, other, method=None, **kwargs): result = df1.merge(df2, left_on=['a'], right_on=['c'], how='inner') self.assertEquals(result.filename,'fname1.csv|fname2.csv') + # concat + # GH 6927 + DataFrame._metadata = ['filename'] + df1 = DataFrame(np.random.randint(0, 4, (3, 2)), columns=list('ab')) + df1.filename = 'foo' + + def finalize(self, other, method=None, **kwargs): + for name in self._metadata: + if method == 'concat': + value = '+'.join([ getattr(o,name) for o in other.objs if getattr(o,name,None) ]) + object.__setattr__(self, name, value) + else: + object.__setattr__(self, name, getattr(other, name, None)) + + return self + + DataFrame.__finalize__ = finalize + + result = pd.concat([df1, df1]) + self.assertEquals(result.filename,'foo+foo') + + # reset DataFrame._metadata = _metadata DataFrame.__finalize__ = _finalize diff --git a/pandas/tools/merge.py b/pandas/tools/merge.py index 42cea510121ee..ef43df98b9235 100644 --- a/pandas/tools/merge.py +++ b/pandas/tools/merge.py @@ -1064,18 +1064,18 @@ def get_result(self): new_data = com._concat_compat([x.get_values() for x in self.objs]) name = com._consensus_name_attr(self.objs) new_data = self._post_merge(new_data) - return Series(new_data, index=self.new_axes[0], name=name) + return Series(new_data, index=self.new_axes[0], name=name).__finalize__(self, method='concat') elif self._is_series: data = dict(zip(range(len(self.objs)), self.objs)) index, columns = self.new_axes tmpdf = DataFrame(data, index=index) if columns is not None: tmpdf.columns = columns - return tmpdf + return tmpdf.__finalize__(self, method='concat') else: new_data = self._get_concatenated_data() new_data = self._post_merge(new_data) - return self.objs[0]._from_axes(new_data, self.new_axes) + return self.objs[0]._from_axes(new_data, self.new_axes).__finalize__(self, method='concat') def _post_merge(self, data): if isinstance(data, BlockManager):