pandas-dev/pandas (original) (raw)
Should this be doable?
In [39]: df = pd.DataFrame({'A': [1, 2], 'B': pd.to_datetime(['a', 'b'])}, index=pd.MultiIndex.from_tuples([(1, 'one'), (1, 'two')]))
In [40]: df Out[40]: A B 1 one 1 a two 2 b
In [41]: wp = pd.Panel({'i1': df, 'i2': df})
In [42]: wp.to_frame()
TypeError Traceback (most recent call last) in () ----> 1 wp.to_frame()
/Users/tom/Envs/pandas-dev/lib/python2.7/site-packages/pandas-0.12.0_993_gda89834-py2.7-macosx-10.8-x86_64.egg/pandas/core/panel.pyc in to_frame(self, filter_observations) 846 index = MultiIndex(levels=[self.major_axis, self.minor_axis], 847 labels=[major_labels, minor_labels], --> 848 names=[maj_name, min_name], verify_integrity=False) 849 850 return DataFrame(data, index=index, columns=self.items)
/Users/tom/Envs/pandas-dev/lib/python2.7/site-packages/pandas-0.12.0_993_gda89834-py2.7-macosx-10.8-x86_64.egg/pandas/core/index.pyc in new(cls, levels, labels, sortorder, names, copy, verify_integrity) 1880 if names is not None: 1881 # handles name validation -> 1882 subarr._set_names(names) 1883 1884 if sortorder is not None:
/Users/tom/Envs/pandas-dev/lib/python2.7/site-packages/pandas-0.12.0_993_gda89834-py2.7-macosx-10.8-x86_64.egg/pandas/core/index.pyc in _set_names(self, values, validate) 2150 # set the name 2151 for name, level in zip(values, self.levels): -> 2152 level.rename(name, inplace=True) 2153 2154 names = property(
/Users/tom/Envs/pandas-dev/lib/python2.7/site-packages/pandas-0.12.0_993_gda89834-py2.7-macosx-10.8-x86_64.egg/pandas/core/index.pyc in set_names(self, names, inplace)
333 """
334 if not com.is_list_like(names):
--> 335 raise TypeError("Must pass list-like as names
.")
336 if inplace:
337 idx = self
TypeError: Must pass list-like as names
.
I think the issue comes when the index of the lower dimensional DataFrame (df
in this case) is already a MultiIndex. These two work:
In [45]: wp.transpose(1, 0, 2).to_frame()
Out[45]:
1
one two
major minor
i1 A 1 2
B a b
i2 A 1 2
B a b
In [46]: wp.transpose(1, 2, 0).to_frame()
Out[46]:
1
one two
major minor
A i1 1 2
i2 1 2
B i1 a b
i2 a b
I was expecting that wp.to_frame()
would create a new MultiIndex with 3 levels:
In [63]: df = pd.DataFrame({'A': [1, 2, 1, 2], 'B': pd.to_datetime(['a', 'b', 'a', 'b'])}, index=pd.MultiIndex.from_tuples([('i1', 1, 'one'), ('i1', 1, 'two'), ('i2', 1, 'one'), ('i2', 1, 'two')]))
In [64]: df Out[64]: A B i1 1 one 1 a two 2 b i2 1 one 1 a two 2 b
The ordering of the new MultiIndex (with wp.items
inserted) is ambiguous... But something like that. You could always swaplevels later.
(side note to myself: check on if verify_integrity
is validate
in MultiIndex land. It doesn't get passed to _set_names
).