Skip to content

Commit 4a37102

Browse files
committed
Merge pull request #6931 from jreback/finalize2
BUG/INT: Internal tests for patching __finalize__ / bug in concat not finalizing (GH6927)
2 parents e8e64ef + 3cd0242 commit 4a37102

File tree

3 files changed

+52
-4
lines changed

3 files changed

+52
-4
lines changed

doc/source/release.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ Bug Fixes
396396
- Bug in ``DataFrame.to_csv`` where setting `index` to `False` ignored the
397397
`header` kwarg (:issue:`6186`)
398398
- Bug in `DataFrame.plot` and `Series.plot` legend behave inconsistently when plotting to the same axes repeatedly (:issue:`6678`)
399-
- Internal tests for patching ``__finalize__`` / bug in merge not finalizing (:issue:`6923`)
399+
- Internal tests for patching ``__finalize__`` / bug in merge not finalizing (:issue:`6923`, :issue:`6927`)
400400

401401
pandas 0.13.1
402402
-------------

pandas/tests/test_generic.py

+48
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,32 @@ def test_metadata_propagation_indiv(self):
440440
result = ts.resample('1T',how=lambda x: x.sum())
441441
self.check_metadata(ts,result)
442442

443+
_metadata = Series._metadata
444+
_finalize = Series.__finalize__
445+
Series._metadata = ['name','filename']
446+
o.filename = 'foo'
447+
o2.filename = 'bar'
448+
449+
def finalize(self, other, method=None, **kwargs):
450+
for name in self._metadata:
451+
if method == 'concat' and name == 'filename':
452+
value = '+'.join([ getattr(o,name) for o in other.objs if getattr(o,name,None) ])
453+
object.__setattr__(self, name, value)
454+
else:
455+
object.__setattr__(self, name, getattr(other, name, None))
456+
457+
return self
458+
459+
Series.__finalize__ = finalize
460+
461+
result = pd.concat([o, o2])
462+
self.assertEquals(result.filename,'foo+bar')
463+
self.assertIsNone(result.name)
464+
465+
# reset
466+
Series._metadata = _metadata
467+
Series.__finalize__ = _finalize
468+
443469
def test_interpolate(self):
444470
ts = Series(np.arange(len(self.ts), dtype=float), self.ts.index)
445471

@@ -894,6 +920,28 @@ def finalize(self, other, method=None, **kwargs):
894920
result = df1.merge(df2, left_on=['a'], right_on=['c'], how='inner')
895921
self.assertEquals(result.filename,'fname1.csv|fname2.csv')
896922

923+
# concat
924+
# GH 6927
925+
DataFrame._metadata = ['filename']
926+
df1 = DataFrame(np.random.randint(0, 4, (3, 2)), columns=list('ab'))
927+
df1.filename = 'foo'
928+
929+
def finalize(self, other, method=None, **kwargs):
930+
for name in self._metadata:
931+
if method == 'concat':
932+
value = '+'.join([ getattr(o,name) for o in other.objs if getattr(o,name,None) ])
933+
object.__setattr__(self, name, value)
934+
else:
935+
object.__setattr__(self, name, getattr(other, name, None))
936+
937+
return self
938+
939+
DataFrame.__finalize__ = finalize
940+
941+
result = pd.concat([df1, df1])
942+
self.assertEquals(result.filename,'foo+foo')
943+
944+
# reset
897945
DataFrame._metadata = _metadata
898946
DataFrame.__finalize__ = _finalize
899947

pandas/tools/merge.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1064,18 +1064,18 @@ def get_result(self):
10641064
new_data = com._concat_compat([x.get_values() for x in self.objs])
10651065
name = com._consensus_name_attr(self.objs)
10661066
new_data = self._post_merge(new_data)
1067-
return Series(new_data, index=self.new_axes[0], name=name)
1067+
return Series(new_data, index=self.new_axes[0], name=name).__finalize__(self, method='concat')
10681068
elif self._is_series:
10691069
data = dict(zip(range(len(self.objs)), self.objs))
10701070
index, columns = self.new_axes
10711071
tmpdf = DataFrame(data, index=index)
10721072
if columns is not None:
10731073
tmpdf.columns = columns
1074-
return tmpdf
1074+
return tmpdf.__finalize__(self, method='concat')
10751075
else:
10761076
new_data = self._get_concatenated_data()
10771077
new_data = self._post_merge(new_data)
1078-
return self.objs[0]._from_axes(new_data, self.new_axes)
1078+
return self.objs[0]._from_axes(new_data, self.new_axes).__finalize__(self, method='concat')
10791079

10801080
def _post_merge(self, data):
10811081
if isinstance(data, BlockManager):

0 commit comments

Comments
 (0)