Skip to content
Closed
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
642bfce
add subclassed stack/unstack/pivot tests
delgadom Mar 8, 2017
0295604
add melt test
delgadom Mar 8, 2017
60a2cfd
use _constructor* properties to create Series and DataFrame objects t…
delgadom Mar 8, 2017
d65cff5
document _Unstacker
delgadom Mar 8, 2017
9d1cf63
fix bug in wide_to_long_test, add GH issue numbers
delgadom Mar 11, 2017
3efb82f
add whatsnew entry
delgadom Mar 11, 2017
200c752
flake8 cleanup
delgadom Mar 11, 2017
5e480c6
fix bug in existing docs ``internals.rst:220`` ``{A, [`` --> ``{A: [``
delgadom Mar 11, 2017
4f3319c
clarify language and add subclassed reshape and math examples to doc/…
delgadom Mar 11, 2017
8af21c1
additional clarification in doc/source/internals.rst
delgadom Mar 11, 2017
027f36a
remove references to Panel from doc/source/internals.rst subclassing …
delgadom Mar 11, 2017
8a61374
change code-block to ipython directives in doc/source/internals.rst
delgadom Mar 12, 2017
6715a25
change from python to ipython code blocks in docs
delgadom May 13, 2017
f751a85
reformat docstrings
delgadom May 13, 2017
ca85796
add subclassed stack/unstack/pivot tests
delgadom Mar 8, 2017
b0bc8f4
add melt test
delgadom Mar 8, 2017
246a464
use _constructor* properties to create Series and DataFrame objects t…
delgadom Mar 8, 2017
1c672a9
document _Unstacker
delgadom Mar 8, 2017
eff151e
fix bug in wide_to_long_test, add GH issue numbers
delgadom Mar 11, 2017
16dae8e
flake8 cleanup
delgadom Mar 11, 2017
66b2e42
fix bug in existing docs ``internals.rst:220`` ``{A, [`` --> ``{A: [``
delgadom Mar 11, 2017
7641812
clarify language and add subclassed reshape and math examples to doc/…
delgadom Mar 11, 2017
be66ce0
additional clarification in doc/source/internals.rst
delgadom Mar 11, 2017
d27034d
remove references to Panel from doc/source/internals.rst subclassing …
delgadom Mar 11, 2017
dc3b07e
merge conflicts
delgadom May 13, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
use _constructor* properties to create Series and DataFrame objects t…
…o preverve subclasses
  • Loading branch information
delgadom committed May 13, 2017
commit 246a464973764d02914ff29bf9188ef09acba1af
29 changes: 17 additions & 12 deletions pandas/core/reshape/reshape.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ class _Unstacker(object):
"""

def __init__(self, values, index, level=-1, value_columns=None,
fill_value=None):
fill_value=None,
constructor=DataFrame):

self.is_categorical = None
if values.ndim == 1:
Expand All @@ -83,6 +84,7 @@ def __init__(self, values, index, level=-1, value_columns=None,
self.values = values
self.value_columns = value_columns
self.fill_value = fill_value
self.constructor = constructor

if value_columns is None and values.shape[1] != 1: # pragma: no cover
raise ValueError('must pass column labels for multi-column data')
Expand Down Expand Up @@ -177,7 +179,7 @@ def get_result(self):
ordered=ordered)
for i in range(values.shape[-1])]

return DataFrame(values, index=index, columns=columns)
return self.constructor(values, index=index, columns=columns)

def get_new_values(self):
values = self.values
Expand Down Expand Up @@ -373,8 +375,9 @@ def pivot(self, index=None, columns=None, values=None):
index = self.index
else:
index = self[index]
indexed = Series(self[values].values,
index=MultiIndex.from_arrays([index, self[columns]]))
indexed = self._constructor_sliced(
self[values].values,
index=MultiIndex.from_arrays([index, self[columns]]))
return indexed.unstack(columns)


Expand Down Expand Up @@ -455,7 +458,8 @@ def unstack(obj, level, fill_value=None):
return obj.T.stack(dropna=False)
else:
unstacker = _Unstacker(obj.values, obj.index, level=level,
fill_value=fill_value)
fill_value=fill_value,
constructor=obj._constructor_expanddim)
return unstacker.get_result()


Expand Down Expand Up @@ -487,13 +491,14 @@ def _unstack_frame(obj, level, fill_value=None):
newb = make_block(new_values.T, placement=new_placement)
new_blocks.append(newb)

result = DataFrame(BlockManager(new_blocks, new_axes))
mask_frame = DataFrame(BlockManager(mask_blocks, new_axes))
result = obj._constructor(BlockManager(new_blocks, new_axes))
mask_frame = obj._constructor(BlockManager(mask_blocks, new_axes))
return result.loc[:, mask_frame.sum(0) > 0]
else:
unstacker = _Unstacker(obj.values, obj.index, level=level,
value_columns=obj.columns,
fill_value=fill_value)
fill_value=fill_value,
constructor=obj._constructor)
return unstacker.get_result()


Expand Down Expand Up @@ -550,7 +555,7 @@ def factorize(index):
mask = notnull(new_values)
new_values = new_values[mask]
new_index = new_index[mask]
return Series(new_values, index=new_index)
return frame._constructor_sliced(new_values, index=new_index)


def stack_multiple(frame, level, dropna=True):
Expand Down Expand Up @@ -696,7 +701,7 @@ def _convert_level_number(level_num, columns):
new_index = MultiIndex(levels=new_levels, labels=new_labels,
names=new_names, verify_integrity=False)

result = DataFrame(new_data, index=new_index, columns=new_columns)
result = frame._constructor(new_data, index=new_index, columns=new_columns)

# more efficient way to go about this? can do the whole masking biz but
# will only save a small amount of time...
Expand Down Expand Up @@ -770,7 +775,7 @@ def melt(frame, id_vars=None, value_vars=None, var_name=None,
mdata[col] = np.asanyarray(frame.columns
._get_level_values(i)).repeat(N)

return DataFrame(mdata, columns=mcolumns)
return frame._constructor(mdata, columns=mcolumns)


def lreshape(data, groups, dropna=True, label=None):
Expand Down Expand Up @@ -839,7 +844,7 @@ def lreshape(data, groups, dropna=True, label=None):
if not mask.all():
mdata = dict((k, v[mask]) for k, v in compat.iteritems(mdata))

return DataFrame(mdata, columns=id_cols + pivot_cols)
return data._constructor(mdata, columns=id_cols + pivot_cols)


def wide_to_long(df, stubnames, i, j, sep="", suffix='\d+'):
Expand Down