@@ -213,7 +213,7 @@ def add_flex_arithmetic_methods(cls, flex_arith_method, radd_func=None,
213213
214214 Parameters
215215 ----------
216- flex_arith_method : function (optional)
216+ flex_arith_method : function
217217 factory for special arithmetic methods, with op string:
218218 f(op, name, str_rep, default_axis=None, fill_zeros=None, **eval_kwargs)
219219 radd_func : function (optional)
@@ -703,12 +703,35 @@ def _radd_compat(left, right):
703703
704704 return output
705705
706+ _op_descriptions = {'add' : {'op' : '+' , 'desc' : 'Addition' , 'reversed' : False , 'reverse' : 'radd' },
707+ 'sub' : {'op' : '-' , 'desc' : 'Subtraction' , 'reversed' : False , 'reverse' : 'rsub' },
708+ 'mul' : {'op' : '*' , 'desc' : 'Multiplication' , 'reversed' : False , 'reverse' : 'rmul' },
709+ 'mod' : {'op' : '%' , 'desc' : 'Modulo' , 'reversed' : False , 'reverse' : 'rmod' },
710+ 'pow' : {'op' : '**' , 'desc' : 'Exponential power' , 'reversed' : False , 'reverse' : 'rpow' },
711+ 'truediv' : {'op' : '/' , 'desc' : 'Floating division' , 'reversed' : False , 'reverse' : 'rtruediv' },
712+ 'floordiv' : {'op' : '//' , 'desc' : 'Integer division' , 'reversed' : False , 'reverse' : 'rfloordiv' }}
713+
714+ _op_names = list (_op_descriptions .keys ())
715+ for k in _op_names :
716+ reverse_op = _op_descriptions [k ]['reverse' ]
717+ _op_descriptions [reverse_op ] = _op_descriptions [k ].copy ()
718+ _op_descriptions [reverse_op ]['reversed' ] = True
719+ _op_descriptions [reverse_op ]['reverse' ] = k
706720
707721def _flex_method_SERIES (op , name , str_rep , default_axis = None ,
708722 fill_zeros = None , ** eval_kwargs ):
723+ op_name = name .replace ('__' , '' )
724+ op_desc = _op_descriptions [op_name ]
725+ if op_desc ['reversed' ]:
726+ equiv = 'other ' + op_desc ['op' ] + ' series'
727+ else :
728+ equiv = 'series ' + op_desc ['op' ] + ' other'
729+
709730 doc = """
710- Binary operator %s with support to substitute a fill_value for missing data
711- in one of the inputs
731+ %s of series and other, element-wise (binary operator `%s`).
732+
733+ Equivalent to ``%s``, but with support to substitute a fill_value for
734+ missing data in one of the inputs.
712735
713736 Parameters
714737 ----------
@@ -723,7 +746,11 @@ def _flex_method_SERIES(op, name, str_rep, default_axis=None,
723746 Returns
724747 -------
725748 result : Series
726- """ % name
749+
750+ See also
751+ --------
752+ Series.%s
753+ """ % (op_desc ['desc' ], op_name , equiv , op_desc ['reverse' ])
727754
728755 @Appender (doc )
729756 def flex_wrapper (self , other , level = None , fill_value = None , axis = 0 ):
@@ -813,7 +840,48 @@ def na_op(x, y):
813840
814841 return result
815842
816- @Appender (_arith_doc_FRAME % name )
843+ if name in _op_descriptions :
844+ op_name = name .replace ('__' , '' )
845+ op_desc = _op_descriptions [op_name ]
846+ if op_desc ['reversed' ]:
847+ equiv = 'other ' + op_desc ['op' ] + ' dataframe'
848+ else :
849+ equiv = 'dataframe ' + op_desc ['op' ] + ' other'
850+
851+ doc = """
852+ %s of dataframe and other, element-wise (binary operator `%s`).
853+
854+ Equivalent to ``%s``, but with support to substitute a fill_value for
855+ missing data in one of the inputs.
856+
857+ Parameters
858+ ----------
859+ other : Series, DataFrame, or constant
860+ axis : {0, 1, 'index', 'columns'}
861+ For Series input, axis to match Series index on
862+ fill_value : None or float value, default None
863+ Fill missing (NaN) values with this value. If both DataFrame locations are
864+ missing, the result will be missing
865+ level : int or name
866+ Broadcast across a level, matching Index values on the
867+ passed MultiIndex level
868+
869+ Notes
870+ -----
871+ Mismatched indices will be unioned together
872+
873+ Returns
874+ -------
875+ result : DataFrame
876+
877+ See also
878+ --------
879+ DataFrame.%s
880+ """ % (op_desc ['desc' ], op_name , equiv , op_desc ['reverse' ])
881+ else :
882+ doc = _arith_doc_FRAME % name
883+
884+ @Appender (doc )
817885 def f (self , other , axis = default_axis , level = None , fill_value = None ):
818886 if isinstance (other , pd .DataFrame ): # Another DataFrame
819887 return self ._combine_frame (other , na_op , fill_value , level )
0 commit comments