From ae37790ec062fb9f6d3227f44969b8da0d422ad1 Mon Sep 17 00:00:00 2001 From: jreback Date: Tue, 22 Apr 2014 10:00:16 -0400 Subject: [PATCH] BUG/INT: Internal tests for patching __finalize__ / bug in merge not finalizing (GH 6923) --- doc/source/release.rst | 1 + pandas/core/generic.py | 5 +++-- pandas/tests/test_generic.py | 33 ++++++++++++++++++++++++++++++++- pandas/tools/merge.py | 2 +- 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/doc/source/release.rst b/doc/source/release.rst index d2de554f1d054..245dd71886f63 100644 --- a/doc/source/release.rst +++ b/doc/source/release.rst @@ -391,6 +391,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`) pandas 0.13.1 ------------- diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 919ea4c0e74ce..9c3b3fab9f455 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -1827,8 +1827,9 @@ def __finalize__(self, other, method=None, **kwargs): types of propagation actions based on this """ - for name in self._metadata: - object.__setattr__(self, name, getattr(other, name, None)) + if isinstance(other, NDFrame): + for name in self._metadata: + object.__setattr__(self, name, getattr(other, name, None)) return self def __getattr__(self, name): diff --git a/pandas/tests/test_generic.py b/pandas/tests/test_generic.py index 6c6e70b86105f..9556f5d9f9a62 100644 --- a/pandas/tests/test_generic.py +++ b/pandas/tests/test_generic.py @@ -3,7 +3,7 @@ from datetime import datetime, timedelta import operator import nose - +import copy import numpy as np from numpy import nan import pandas as pd @@ -866,6 +866,37 @@ def test_metadata_propagation_indiv(self): result = df.resample('1T') self.check_metadata(df,result) + # merging with override + # GH 6923 + _metadata = DataFrame._metadata + _finalize = DataFrame.__finalize__ + + np.random.seed(10) + df1 = DataFrame(np.random.randint(0, 4, (3, 2)), columns=['a', 'b']) + df2 = DataFrame(np.random.randint(0, 4, (3, 2)), columns=['c', 'd']) + DataFrame._metadata = ['filename'] + df1.filename = 'fname1.csv' + df2.filename = 'fname2.csv' + + def finalize(self, other, method=None, **kwargs): + + for name in self._metadata: + if method == 'merge': + left, right = other.left, other.right + value = getattr(left, name, '') + '|' + getattr(right, name, '') + object.__setattr__(self, name, value) + else: + object.__setattr__(self, name, getattr(other, name, '')) + + return self + + DataFrame.__finalize__ = finalize + result = df1.merge(df2, left_on=['a'], right_on=['c'], how='inner') + self.assertEquals(result.filename,'fname1.csv|fname2.csv') + + DataFrame._metadata = _metadata + DataFrame.__finalize__ = _finalize + class TestPanel(tm.TestCase, Generic): _typ = Panel _comparator = lambda self, x, y: assert_panel_equal(x, y) diff --git a/pandas/tools/merge.py b/pandas/tools/merge.py index 90e713d72bdda..42cea510121ee 100644 --- a/pandas/tools/merge.py +++ b/pandas/tools/merge.py @@ -195,7 +195,7 @@ def get_result(self): copy=self.copy) result_data = join_op.get_result() - result = DataFrame(result_data) + result = DataFrame(result_data).__finalize__(self, method='merge') self._maybe_add_join_keys(result, left_indexer, right_indexer)