@@ -213,7 +213,7 @@ def add_flex_arithmetic_methods(cls, flex_arith_method, radd_func=None,
213
213
214
214
Parameters
215
215
----------
216
- flex_arith_method : function (optional)
216
+ flex_arith_method : function
217
217
factory for special arithmetic methods, with op string:
218
218
f(op, name, str_rep, default_axis=None, fill_zeros=None, **eval_kwargs)
219
219
radd_func : function (optional)
@@ -703,12 +703,34 @@ def _radd_compat(left, right):
703
703
704
704
return output
705
705
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
706
720
707
721
def _flex_method_SERIES (op , name , str_rep , default_axis = None ,
708
722
fill_zeros = None , ** eval_kwargs ):
723
+ op_desc = _op_descriptions [name .replace ('__' , '' )]
724
+ if op_desc ['reversed' ]:
725
+ equiv = 'other ' + op_desc ['op' ] + ' series'
726
+ else :
727
+ equiv = 'series ' + op_desc ['op' ] + ' other'
728
+
709
729
doc = """
710
- Binary operator %s with support to substitute a fill_value for missing data
711
- in one of the inputs
730
+ %s of series and other, element-wise (binary operator `%s`).
731
+
732
+ Equivalent to ``%s``, but with support to substitute a fill_value for
733
+ missing data in one of the inputs.
712
734
713
735
Parameters
714
736
----------
@@ -723,7 +745,11 @@ def _flex_method_SERIES(op, name, str_rep, default_axis=None,
723
745
Returns
724
746
-------
725
747
result : Series
726
- """ % name
748
+
749
+ See also
750
+ --------
751
+ Series.%s
752
+ """ % (op_desc ['desc' ], op_desc ['op' ], equiv , op_desc ['reverse' ])
727
753
728
754
@Appender (doc )
729
755
def flex_wrapper (self , other , level = None , fill_value = None , axis = 0 ):
@@ -813,7 +839,47 @@ def na_op(x, y):
813
839
814
840
return result
815
841
816
- @Appender (_arith_doc_FRAME % name )
842
+ if name in _op_descriptions :
843
+ op_desc = _op_descriptions [name .replace ('__' , '' )]
844
+ if op_desc ['reversed' ]:
845
+ equiv = 'other ' + op_desc ['op' ] + ' dataframe'
846
+ else :
847
+ equiv = 'dataframe ' + op_desc ['op' ] + ' other'
848
+
849
+ doc = """
850
+ %s of dataframe and other, element-wise (binary operator `%s`).
851
+
852
+ Equivalent to ``%s``, but with support to substitute a fill_value for
853
+ missing data in one of the inputs.
854
+
855
+ Parameters
856
+ ----------
857
+ other : Series, DataFrame, or constant
858
+ axis : {0, 1, 'index', 'columns'}
859
+ For Series input, axis to match Series index on
860
+ fill_value : None or float value, default None
861
+ Fill missing (NaN) values with this value. If both DataFrame locations are
862
+ missing, the result will be missing
863
+ level : int or name
864
+ Broadcast across a level, matching Index values on the
865
+ passed MultiIndex level
866
+
867
+ Notes
868
+ -----
869
+ Mismatched indices will be unioned together
870
+
871
+ Returns
872
+ -------
873
+ result : DataFrame
874
+
875
+ See also
876
+ --------
877
+ DataFrame.%s
878
+ """ % (op_desc ['desc' ], op_desc ['op' ], equiv , op_desc ['reverse' ])
879
+ else :
880
+ doc = _arith_doc_FRAME % name
881
+
882
+ @Appender (doc )
817
883
def f (self , other , axis = default_axis , level = None , fill_value = None ):
818
884
if isinstance (other , pd .DataFrame ): # Another DataFrame
819
885
return self ._combine_frame (other , na_op , fill_value , level )
0 commit comments