@@ -100,7 +100,7 @@ def _convert_tuple(self, key):
100100 return tuple (keyidx )
101101
102102 def _setitem_with_indexer (self , indexer , value ):
103- from pandas . core . frame import DataFrame , Series
103+ from pandas import Panel , DataFrame , Series
104104
105105 # also has the side effect of consolidating in-place
106106
@@ -181,6 +181,9 @@ def setter(item, v):
181181 if isinstance (value , DataFrame ):
182182 value = self ._align_frame (indexer , value )
183183
184+ if isinstance (value , Panel ):
185+ value = self ._align_panel (indexer , value )
186+
184187 # 2096
185188 values = self .obj .values
186189 if np .prod (values .shape ):
@@ -208,12 +211,11 @@ def _align_series(self, indexer, ser):
208211 raise ValueError ('Incompatible indexer with Series' )
209212
210213 def _align_frame (self , indexer , df ):
211- from pandas import DataFrame
212- is_frame = isinstance (self .obj , DataFrame )
213- if not is_frame :
214- df = df .T
214+ is_frame = self .obj .ndim == 2
215+ is_panel = self .obj .ndim >= 3
215216 if isinstance (indexer , tuple ):
216217 idx , cols = None , None
218+ sindexers = []
217219 for i , ix in enumerate (indexer ):
218220 ax = self .obj .axes [i ]
219221 if com ._is_sequence (ix ) or isinstance (ix , slice ):
@@ -223,6 +225,16 @@ def _align_frame(self, indexer, df):
223225 cols = ax [ix ].ravel ()
224226 else :
225227 break
228+ else :
229+ sindexers .append (i )
230+
231+ # panel
232+ if is_panel :
233+ if len (sindexers ) == 1 and idx is None and cols is None :
234+ if sindexers [0 ] == 0 :
235+ df = df .T
236+ return self .obj .conform (df ,axis = sindexers [0 ])
237+ df = df .T
226238
227239 if idx is not None and cols is not None :
228240 if df .index .equals (idx ) and df .columns .equals (cols ):
@@ -244,12 +256,27 @@ def _align_frame(self, indexer, df):
244256 idx = self .obj .axes [1 ]
245257 cols = self .obj .axes [2 ]
246258
259+ # by definition we are indexing on the 0th axis
260+ if is_panel :
261+ df = df .T
262+
247263 if idx .equals (df .index ) and cols .equals (df .columns ):
248264 return df .copy ().values
265+
266+ # a passed in dataframe which is actually a transpose
267+ # of what is needed
268+ elif idx .equals (df .columns ) and cols .equals (df .index ):
269+ return df .T .copy ().values
270+
249271 return df .reindex (idx , columns = cols ).values
250272
251273 raise ValueError ('Incompatible indexer with DataFrame' )
252274
275+ def _align_panel (self , indexer , df ):
276+ is_frame = self .obj .ndim == 2
277+ is_panel = self .obj .ndim >= 3
278+ raise NotImplementedError ("cannot set using an indexer with a Panel yet!" )
279+
253280 def _getitem_tuple (self , tup ):
254281 try :
255282 return self ._getitem_lowerdim (tup )
0 commit comments