@@ -1275,20 +1275,61 @@ def test_setitem_single_column_mixed_datetime(self):
12751275 df .ix ['d' , :] = nan
12761276 self .assert_ (com .isnull (df .ix ['c' , :]).all () == False )
12771277
1278+ # as of GH 3216 this will now work!
12781279 # try to set with a list like item
1279- self .assertRaises (
1280- Exception , df .ix .__setitem__ , ('d' , 'timestamp' ), [nan ])
1280+ # self.assertRaises(
1281+ # Exception, df.ix.__setitem__, ('d', 'timestamp'), [nan])
12811282
12821283 def test_setitem_frame (self ):
12831284 piece = self .frame .ix [:2 , ['A' , 'B' ]]
12841285 self .frame .ix [- 2 :, ['A' , 'B' ]] = piece .values
12851286 assert_almost_equal (self .frame .ix [- 2 :, ['A' , 'B' ]].values ,
12861287 piece .values )
12871288
1289+ # GH 3216
1290+
1291+ # already aligned
1292+ f = self .mixed_frame .copy ()
1293+ piece = DataFrame ([[ 1 , 2 ], [3 , 4 ]], index = f .index [0 :2 ],columns = ['A' , 'B' ])
1294+ key = (slice (None ,2 ), ['A' , 'B' ])
1295+ f .ix [key ] = piece
1296+ assert_almost_equal (f .ix [0 :2 , ['A' , 'B' ]].values ,
1297+ piece .values )
1298+
1299+ # rows unaligned
1300+ f = self .mixed_frame .copy ()
1301+ piece = DataFrame ([[ 1 , 2 ], [3 , 4 ], [5 , 6 ], [7 , 8 ]], index = list (f .index [0 :2 ]) + ['foo' ,'bar' ],columns = ['A' , 'B' ])
1302+ key = (slice (None ,2 ), ['A' , 'B' ])
1303+ f .ix [key ] = piece
1304+ assert_almost_equal (f .ix [0 :2 :, ['A' , 'B' ]].values ,
1305+ piece .values [0 :2 ])
1306+
1307+ # key is unaligned with values
1308+ f = self .mixed_frame .copy ()
1309+ piece = f .ix [:2 , ['A' ]]
1310+ key = (slice (- 2 , None ), ['A' , 'B' ])
1311+ f .ix [key ] = piece
1312+ piece ['B' ] = np .nan
1313+ assert_almost_equal (f .ix [- 2 :, ['A' , 'B' ]].values ,
1314+ piece .values )
1315+
1316+ # ndarray
1317+ f = self .mixed_frame .copy ()
12881318 piece = self .mixed_frame .ix [:2 , ['A' , 'B' ]]
1289- f = self .mixed_frame .ix .__setitem__
12901319 key = (slice (- 2 , None ), ['A' , 'B' ])
1291- self .assertRaises (ValueError , f , key , piece )
1320+ f .ix [key ] = piece .values
1321+ assert_almost_equal (f .ix [- 2 :, ['A' , 'B' ]].values ,
1322+ piece .values )
1323+
1324+
1325+ # needs upcasting
1326+ df = DataFrame ([[1 ,2 ,'foo' ],[3 ,4 ,'bar' ]],columns = ['A' ,'B' ,'C' ])
1327+ df2 = df .copy ()
1328+ df2 .ix [:,['A' ,'B' ]] = df .ix [:,['A' ,'B' ]]+ 0.5
1329+ expected = df .reindex (columns = ['A' ,'B' ])
1330+ expected += 0.5
1331+ expected ['C' ] = df ['C' ]
1332+ assert_frame_equal (df2 , expected )
12921333
12931334 def test_setitem_frame_align (self ):
12941335 piece = self .frame .ix [:2 , ['A' , 'B' ]]
0 commit comments