Skip to content

Commit d206f83

Browse files
committed
Merge pull request #6924 from jreback/finalize
BUG/INT: Internal tests for patching __finalize__ / bug in merge not finalizing (GH6923)
2 parents 583b4d4 + ae37790 commit d206f83

File tree

4 files changed

+37
-4
lines changed

4 files changed

+37
-4
lines changed

doc/source/release.rst

+1
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,7 @@ Bug Fixes
391391
- Bug in ``DataFrame.to_csv`` where setting `index` to `False` ignored the
392392
`header` kwarg (:issue:`6186`)
393393
- Bug in `DataFrame.plot` and `Series.plot` legend behave inconsistently when plotting to the same axes repeatedly (:issue:`6678`)
394+
- Internal tests for patching ``__finalize__`` / bug in merge not finalizing (:issue:`6923`)
394395

395396
pandas 0.13.1
396397
-------------

pandas/core/generic.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1827,8 +1827,9 @@ def __finalize__(self, other, method=None, **kwargs):
18271827
types of propagation actions based on this
18281828
18291829
"""
1830-
for name in self._metadata:
1831-
object.__setattr__(self, name, getattr(other, name, None))
1830+
if isinstance(other, NDFrame):
1831+
for name in self._metadata:
1832+
object.__setattr__(self, name, getattr(other, name, None))
18321833
return self
18331834

18341835
def __getattr__(self, name):

pandas/tests/test_generic.py

+32-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from datetime import datetime, timedelta
44
import operator
55
import nose
6-
6+
import copy
77
import numpy as np
88
from numpy import nan
99
import pandas as pd
@@ -866,6 +866,37 @@ def test_metadata_propagation_indiv(self):
866866
result = df.resample('1T')
867867
self.check_metadata(df,result)
868868

869+
# merging with override
870+
# GH 6923
871+
_metadata = DataFrame._metadata
872+
_finalize = DataFrame.__finalize__
873+
874+
np.random.seed(10)
875+
df1 = DataFrame(np.random.randint(0, 4, (3, 2)), columns=['a', 'b'])
876+
df2 = DataFrame(np.random.randint(0, 4, (3, 2)), columns=['c', 'd'])
877+
DataFrame._metadata = ['filename']
878+
df1.filename = 'fname1.csv'
879+
df2.filename = 'fname2.csv'
880+
881+
def finalize(self, other, method=None, **kwargs):
882+
883+
for name in self._metadata:
884+
if method == 'merge':
885+
left, right = other.left, other.right
886+
value = getattr(left, name, '') + '|' + getattr(right, name, '')
887+
object.__setattr__(self, name, value)
888+
else:
889+
object.__setattr__(self, name, getattr(other, name, ''))
890+
891+
return self
892+
893+
DataFrame.__finalize__ = finalize
894+
result = df1.merge(df2, left_on=['a'], right_on=['c'], how='inner')
895+
self.assertEquals(result.filename,'fname1.csv|fname2.csv')
896+
897+
DataFrame._metadata = _metadata
898+
DataFrame.__finalize__ = _finalize
899+
869900
class TestPanel(tm.TestCase, Generic):
870901
_typ = Panel
871902
_comparator = lambda self, x, y: assert_panel_equal(x, y)

pandas/tools/merge.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ def get_result(self):
195195
copy=self.copy)
196196

197197
result_data = join_op.get_result()
198-
result = DataFrame(result_data)
198+
result = DataFrame(result_data).__finalize__(self, method='merge')
199199

200200
self._maybe_add_join_keys(result, left_indexer, right_indexer)
201201

0 commit comments

Comments
 (0)