@@ -762,32 +762,95 @@ def compare(result, expected):
762762 result2 = s .loc [0 :3 ]
763763 assert_series_equal (result1 ,result2 )
764764
765- def test_loc_setitem_multiindex (self ):
765+ def test_setitem_multiindex (self ):
766+ for index_fn in ('ix' , 'loc' ):
767+ def check (target , indexers , value , compare_fn , expected = None ):
768+ fn = getattr (target , index_fn )
769+ fn .__setitem__ (indexers , value )
770+ result = fn .__getitem__ (indexers )
771+ if expected is None :
772+ expected = value
773+ compare_fn (result , expected )
774+ # GH7190
775+ index = pd .MultiIndex .from_product ([np .arange (0 ,100 ), np .arange (0 , 80 )], names = ['time' , 'firm' ])
776+ t , n = 0 , 2
777+ df = DataFrame (np .nan ,columns = ['A' , 'w' , 'l' , 'a' , 'x' , 'X' , 'd' , 'profit' ], index = index )
778+ check (
779+ target = df , indexers = ((t ,n ), 'X' ),
780+ value = 0 , compare_fn = self .assertEqual
781+ )
766782
767- # GH7190
768- index = pd .MultiIndex .from_product ([np .arange (0 ,100 ), np .arange (0 , 80 )], names = ['time' , 'firm' ])
769- t , n = 0 , 2
783+ df = DataFrame (- 999 ,columns = ['A' , 'w' , 'l' , 'a' , 'x' , 'X' , 'd' , 'profit' ], index = index )
784+ check (
785+ target = df , indexers = ((t ,n ), 'X' ),
786+ value = 1 , compare_fn = self .assertEqual
787+ )
770788
771- df = DataFrame (np .nan ,columns = ['A' , 'w' , 'l' , 'a' , 'x' , 'X' , 'd' , 'profit' ], index = index )
772- df .loc [(t ,n ),'X' ] = 0
773- result = df .loc [(t ,n ),'X' ]
774- self .assertEqual (result , 0 )
789+ df = DataFrame (columns = ['A' , 'w' , 'l' , 'a' , 'x' , 'X' , 'd' , 'profit' ], index = index )
790+ check (
791+ target = df , indexers = ((t ,n ), 'X' ),
792+ value = 2 , compare_fn = self .assertEqual
793+ )
775794
776- df = DataFrame (- 999 ,columns = ['A' , 'w' , 'l' , 'a' , 'x' , 'X' , 'd' , 'profit' ], index = index )
777- df .loc [(t ,n ),'X' ] = 1
778- result = df .loc [(t ,n ),'X' ]
779- self .assertEqual (result , 1 )
795+ # GH 7218, assinging with 0-dim arrays
796+ df = DataFrame (- 999 ,columns = ['A' , 'w' , 'l' , 'a' , 'x' , 'X' , 'd' , 'profit' ], index = index )
797+ check (
798+ target = df , indexers = ((t ,n ), 'X' ),
799+ value = np .array (3 ), compare_fn = self .assertEqual ,
800+ expected = 3 ,
801+ )
780802
781- df = DataFrame (columns = ['A' , 'w' , 'l' , 'a' , 'x' , 'X' , 'd' , 'profit' ], index = index )
782- df .loc [(t ,n ),'X' ] = 2
783- result = df .loc [(t ,n ),'X' ]
784- self .assertEqual (result , 2 )
803+ # GH5206
804+ df = pd .DataFrame (
805+ np .arange (25 ).reshape (5 , 5 ), columns = 'A,B,C,D,E' .split (',' ),
806+ dtype = float
807+ )
808+ df ['F' ] = 99
809+ row_selection = df ['A' ] % 2 == 0
810+ col_selection = ['B' , 'C' ]
811+ df .ix [row_selection , col_selection ] = df ['F' ]
812+ output = pd .DataFrame (99. , index = [0 , 2 , 4 ], columns = ['B' , 'C' ])
813+ assert_frame_equal (df .ix [row_selection , col_selection ], output )
814+ check (
815+ target = df , indexers = (row_selection , col_selection ),
816+ value = df ['F' ], compare_fn = assert_frame_equal ,
817+ expected = output ,
818+ )
785819
786- # GH 7218, assinging with 0-dim arrays
787- df = DataFrame (- 999 ,columns = ['A' , 'w' , 'l' , 'a' , 'x' , 'X' , 'd' , 'profit' ], index = index )
788- df .loc [(t ,n ), 'X' ] = np .array (3 )
789- result = df .loc [(t ,n ),'X' ]
790- self .assertEqual (result ,3 )
820+ # GH11372
821+ idx = pd .MultiIndex .from_product ([
822+ ['A' , 'B' , 'C' ],
823+ pd .date_range ('2015-01-01' , '2015-04-01' , freq = 'MS' )
824+ ])
825+ cols = pd .MultiIndex .from_product ([
826+ ['foo' , 'bar' ],
827+ pd .date_range ('2016-01-01' , '2016-02-01' , freq = 'MS' )
828+ ])
829+ df = pd .DataFrame (np .random .random ((12 , 4 )), index = idx , columns = cols )
830+ subidx = pd .MultiIndex .from_tuples (
831+ [('A' , pd .Timestamp ('2015-01-01' )), ('A' , pd .Timestamp ('2015-02-01' ))]
832+ )
833+ subcols = pd .MultiIndex .from_tuples (
834+ [('foo' , pd .Timestamp ('2016-01-01' )), ('foo' , pd .Timestamp ('2016-02-01' ))]
835+ )
836+ vals = pd .DataFrame (np .random .random ((2 , 2 )), index = subidx , columns = subcols )
837+ check (
838+ target = df , indexers = (subidx , subcols ),
839+ value = vals , compare_fn = assert_frame_equal ,
840+ )
841+ # set all columns
842+ vals = pd .DataFrame (np .random .random ((2 , 4 )), index = subidx , columns = cols )
843+ check (
844+ target = df , indexers = (subidx , slice (None , None , None )),
845+ value = vals , compare_fn = assert_frame_equal ,
846+ )
847+ # identity
848+ copy = df .copy ()
849+ check (
850+ target = df , indexers = (df .index , df .columns ),
851+ value = df , compare_fn = assert_frame_equal ,
852+ expected = copy
853+ )
791854
792855 def test_indexing_with_datetime_tz (self ):
793856
0 commit comments