30
30
from pandas .core .internals import BlockManager , make_block , form_blocks
31
31
from pandas .core .series import Series , _is_bool_indexer
32
32
from pandas .util .decorators import deprecate
33
+ from pandas .util import py3compat
33
34
import pandas .core .common as common
34
35
import pandas .core .datetools as datetools
35
36
import pandas ._tseries as _tseries
@@ -277,6 +278,10 @@ def iteritems(self):
277
278
"""Iterator over (column, series) pairs"""
278
279
series = self ._series
279
280
return ((k , series [k ]) for k in self .columns )
281
+
282
+ iterkv = iteritems
283
+ if py3compat .PY3 :
284
+ items = iteritems
280
285
281
286
def __len__ (self ):
282
287
"""Returns length of index"""
@@ -292,7 +297,7 @@ def __contains__(self, key):
292
297
add = _arith_method (operator .add , 'add' )
293
298
mul = _arith_method (operator .mul , 'multiply' )
294
299
sub = _arith_method (operator .sub , 'subtract' )
295
- div = _arith_method (operator . div , 'divide' )
300
+ div = _arith_method (lambda x , y : x / y , 'divide' )
296
301
297
302
radd = _arith_method (operator .add , 'add' )
298
303
rmul = _arith_method (operator .mul , 'multiply' )
@@ -302,19 +307,26 @@ def __contains__(self, key):
302
307
__add__ = _arith_method (operator .add , '__add__' , default_axis = None )
303
308
__sub__ = _arith_method (operator .sub , '__sub__' , default_axis = None )
304
309
__mul__ = _arith_method (operator .mul , '__mul__' , default_axis = None )
305
- __div__ = _arith_method (operator .div , '__div__' , default_axis = None )
306
310
__truediv__ = _arith_method (operator .truediv , '__truediv__' ,
307
311
default_axis = None )
312
+ __floordiv__ = _arith_method (operator .floordiv , '__floordiv__' ,
313
+ default_axis = None )
308
314
__pow__ = _arith_method (operator .pow , '__pow__' , default_axis = None )
309
315
310
316
__radd__ = _arith_method (operator .add , '__radd__' , default_axis = None )
311
317
__rmul__ = _arith_method (operator .mul , '__rmul__' , default_axis = None )
312
318
__rsub__ = _arith_method (lambda x , y : y - x , '__rsub__' , default_axis = None )
313
- __rdiv__ = _arith_method (lambda x , y : y / x , '__rdiv__' , default_axis = None )
314
319
__rtruediv__ = _arith_method (lambda x , y : y / x , '__rtruediv__' ,
315
320
default_axis = None )
321
+ __rfloordiv__ = _arith_method (lambda x , y : y // x , '__rfloordiv__' ,
322
+ default_axis = None )
316
323
__rpow__ = _arith_method (lambda x , y : y ** x , '__rpow__' ,
317
324
default_axis = None )
325
+
326
+ # Python 2 division methods
327
+ if not py3compat .PY3 :
328
+ __div__ = _arith_method (operator .div , '__div__' , default_axis = None )
329
+ __rdiv__ = _arith_method (lambda x , y : y / x , '__rdiv__' , default_axis = None )
318
330
319
331
def __neg__ (self ):
320
332
return self * - 1
@@ -464,7 +476,7 @@ def to_sparse(self, fill_value=None, kind='block'):
464
476
default_fill_value = fill_value )
465
477
466
478
def to_csv (self , path , nanRep = '' , cols = None , header = True ,
467
- index = True , index_label = None , mode = 'wb ' ):
479
+ index = True , index_label = None , mode = 'w ' ):
468
480
"""
469
481
Write DataFrame to a comma-separated values (csv) file
470
482
@@ -483,7 +495,7 @@ def to_csv(self, path, nanRep='', cols=None, header=True,
483
495
Column label for index column(s) if desired. If None is given, and
484
496
`header` and `index` are True, then the index names are used. A
485
497
sequence should be given if the DataFrame uses MultiIndex.
486
- mode : Python write mode, default 'wb '
498
+ mode : Python write mode, default 'w '
487
499
"""
488
500
f = open (path , mode )
489
501
csvout = csv .writer (f )
@@ -658,7 +670,7 @@ def dtypes(self):
658
670
659
671
def get_dtype_counts (self ):
660
672
counts = {}
661
- for _ , series in self .iteritems ():
673
+ for _ , series in self .iterkv ():
662
674
if series .dtype in counts :
663
675
counts [series .dtype ] += 1
664
676
else :
@@ -915,7 +927,7 @@ def _set_item(self, key, value):
915
927
def _sanitize_column (self , value ):
916
928
# Need to make sure new columns (which go into the BlockManager as new
917
929
# blocks) are always copied
918
- if hasattr (value , '__iter__' ):
930
+ if hasattr (value , '__iter__' ) and not isinstance ( value , basestring ) :
919
931
if isinstance (value , Series ):
920
932
if value .index .equals (self .index ):
921
933
# copy the values
0 commit comments